1、python中的高阶函数
- 变量可以指向函数
- 函数的参数可以接收变量
高阶函数:能够接受函数做参数的函数
2、python中的匿名函数
def f(x):
return x * x
- lambda x: x * x ,关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。
- 匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。
使用匿名函数,可以不必定义函数名,直接创建一个函数对象
3、python中的面向对象编程
在Python中,类通过 class 关键字定义
- 按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的
- 当创建实例时,init()(init是前后是双下划线)方法被自动调用,
- init() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),第一个参数self被Python解释器传入了实例的引用,后续参数则可以自由指定,和定义函数没有任何区别。
相应地,创建实例时,就必须要提供除 self 以外的参数 - 如果一个属性以”xxx“(xxx前后是双下划线)的形式定义,那它又可以被外部访问了,以”xxx“定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用”xxx“定义。
- Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问
class Person(object):
address = 'Earth'
def __init__(self, name):
self.name = name
- 当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问
- 实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的
通过标记一个 @classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用
4、python中的包和模块
一个文件夹下包含init.py(init前后有双下划线)则被视为包
模块名与文件名相同
5、python中的继承
子类的init()函数中一定要用 super(子类类名 , self).init(父类属性,。。。) 去初始化父类。
函数super(子类类名 , self)将返回当前类继承的父类,然后调用init()方法,注意self参数已在super()中传入,在init()中将隐式传递,不需要写出(也不能写)。- 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型
- 一个子类可以继承多个父类
6、python中的特殊方法
- 定义在类中
- 如果要把一个类的实例变成 str,就需要实现特殊方法str(),因为 Python 定义了str()和repr()两种方法,str()用于显示给用户,而repr()用于显示给开发人员。,repr = str
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(Person: %s, %s)' % (self.name, self.gender)
__repr__ = __str__
- 要让 len() 函数工作正常,类必须提供一个特殊方法len(),它返回元素的个数
- 要让int()函数正常工作,只需要实现特殊方法int(),同理,要让float()函数正常工作,只需要实现特殊方法float()。
- 如果要让某个类进行+运算,需要正确实现add(),减法运算:sub
,乘法运算:mul
,除法运算:div
class Rational(object):
def __init__(self, p, q):
self.p = p
self.q = q
def __add__(self, r):
return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
def __sub__(self, r):
return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
def __mul__(self, r):
return Rational(self.p * r.p, self.q * r.q)
def __div__(self, r):
return Rational(self.p * r.q, self.q * r.p)
def __str__(self):
g = gcd(self.p, self.q)
return '%s/%s' % (self.p / g, self.q / g)
__repr__ = __str__
- slots是指一个类允许的属性列表,slots的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用slots也能节省内存。
class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
selfe = score
- 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法call()
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend