在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
位置参数、默认参数、可变参数和关键字参数。 位置参数、默认参数、命名关键字参数和关键字参数。 要注意定义可变参数和关键字参数的语法:
*args 是可变参数,args 接收的是一个 tuple **kw 是关键字参数,kw 接收的是一个 dict 命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名关键字参数不要忘了写分隔符 *,否则定义的是位置参数。
警告:虽然可以组合多达 5 种参数,但不要同时使用太多的组合,否则函数很难懂。
命名关键字参数前面要有星号
【例子】 如果要修改闭包作用域中的变量则需要 nonlocal 关键字
匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中,主要有两种形式:
参数是函数 (filter, map) 返回值是函数 (closure) filter(function, iterable) 过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。 map(function, *iterables) 根据提供的函数对指定序列做映射。 issubclass(class, classinfo) 方法用于判断参数 class 是否是类型参数 classinfo 的子类。 一个类被认为是其自身的子类。 classinfo可以是类对象的元组,只要class是其中任何一个候选类的子类,则返回True。
hasattr(object, name)用于判断对象是否包含对应的属性。 getattr(object, name[, default])用于返回一个对象属性值。 setattr(object, name, value)对应函数 getattr(),用于设置属性值,该属性不一定是存在的。 delattr(object, name)用于删除属性。 new(cls[, …]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。
new会一直调动父类的new’
del(self) 析构器,当一个对象将要被系统回收之时调用的方法。 str(self):
当你打印一个对象的时候,触发__str__ 当你使用%s格式化的时候,触发__str__ str强转数据类型的时候,触发__str__ repr(self):
repr是str的备胎 有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__ repr(obj)内置函数对应的结果是__repr__的返回值 当你使用%r格式化的时候 触发__repr__
mul(self, other)定义乘法的行为:* truediv(self, other)定义真除法的行为:/ floordiv(self, other)定义整数除法的行为:// mod(self, other) 定义取模算法的行为:% divmod(self, other)定义当被 divmod() 调用时的行为 divmod(a, b)把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。 pow(self, other[, module])定义当被 power() 调用或 ** 运算时的行为 lshift(self, other)定义按位左移位的行为:<< rshift(self, other)定义按位右移位的行为:>> and(self, other)定义按位与操作的行为:& xor(self, other)定义按位异或操作的行为:^ or(self, other)定义按位或操作的行为:|
radd(self, other)定义加法的行为:+ rsub(self, other)定义减法的行为:- rmul(self, other)定义乘法的行为:* rtruediv(self, other)定义真除法的行为:/ rfloordiv(self, other)定义整数除法的行为:// rmod(self, other) 定义取模算法的行为:% rdivmod(self, other)定义当被 divmod() 调用时的行为 rpow(self, other[, module])定义当被 power() 调用或 ** 运算时的行为 rlshift(self, other)定义按位左移位的行为:<< rrshift(self, other)定义按位右移位的行为:>> rand(self, other)定义按位与操作的行为:& rxor(self, other)定义按位异或操作的行为:^ ror(self, other)定义按位或操作的行为:|
class Nint(int):
def __radd__(self, other):
return int.__sub__(other, self)
a = Nint(5)
b = Nint(3)
print(a + b)
print(1 + b)
__iadd__(self, other)定义赋值加法的行为:+=
__isub__(self, other)定义赋值减法的行为:-=
__imul__(self, other)定义赋值乘法的行为:*=
__itruediv__(self, other)定义赋值真除法的行为:/=
__ifloordiv__(self, other)定义赋值整数除法的行为://=
__imod__(self, other)定义赋值取模算法的行为:%=
__ipow__(self, other[, modulo])定义赋值幂运算的行为:**=
__ilshift__(self, other)定义赋值按位左移位的行为:<<=
__irshift__(self, other)定义赋值按位右移位的行为:>>=
__iand__(self, other)定义赋值按位与操作的行为:&=
__ixor__(self, other)定义赋值按位异或操作的行为:^=
__ior__(self, other)定义赋值按位或操作的行为:|=
neg(self)定义正号的行为:+x pos(self)定义负号的行为:-x abs(self)定义当被abs()调用时的行为 invert(self)定义按位求反的行为:~x
getattr(self, name): 定义当用户试图获取一个不存在的属性时的行为。 getattribute(self, name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用__getattr__)。 setattr(self, name, value):定义当一个属性被设置时的行为。 delattr(self, name):定义当一个属性被删除时的行为。
get(self, instance, owner)用于访问属性,它返回属性的值。 set(self, instance, value)将在属性分配操作中调用,不返回任何内容。 del(self, instance)控制删除操作,不返回任何内容。
len(self)定义当被len()调用时的行为(返回容器中元素的个数)。 getitem(self, key)定义获取容器中元素的行为,相当于self[key]。 setitem(self, key, value)定义设置容器中指定元素的行为,相当于self[key] = value。 delitem(self, key)定义删除容器中指定元素的行为,相当于del self[key]
|