文章目录
基础函数
help(函数名) 查看函数的帮助信息
使用isinstance()进行数据类型检查
if not isinstance(x, (int, float)): raise TypeError('bad operand type')
使用callable()判断对象能否被调用
callable([1, 2, 3]) # False
可变参数:在函数调用时自动组装为一个tuple
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum calc(1, 2) calc(1, 3, 5, 7)
*nums表示把nums这个list的所有元素作为可变参数传进去
nums = [1, 2, 3] calc(*nums)
关键字参数:传入任意个含参数名的参数,在函数内部自动组装为一个dict
def person(**kw): print(kw) person(city='Beijing') # {'city': 'Beijing'} person(gender='M', job='Engineer') # {'gender': 'M', 'job': 'Engineer'}
命名关键字参数:限制关键字参数的名字,命名关键字参数必须传入参数名。
命名关键字参数需要一个特殊分隔符,后面的参数被视为命名关键字参数。
def person(name, age, *, city, job): print(name, age, city, job) def person(name, age, *args, city, job): print(name, age, args, city, job) person('Jack', 24, job='Engineer') # Jack 24 Beijing Engineer
参数定义的顺序:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
高阶函数
可以接受函数作为参数的函数
def add(x, y, f): return f(x) + f(y) add(-5, 6, abs)
map/reduce
map(function,Iterable) 返回迭代器
def f(x): return x * x map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
reduce(function,Iterable)
其中function接收两个参数,reduce把结果与序列的下一个继续做计算
from functools import reduce def fn(x, y): return x * 10 + y reduce(fn, [1, 3, 5, 7, 9]) # 13569
filter
用于过滤序列
def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # filter返回Iterator
sorted
sorted(list,key,reverse=False) 从小到大排序
key为自定义排序函数,如key=abs, key=str.lower
函数作为返回值
闭包程序结构
返回函数不要引用任何循环变量,或者后续会发生变化的变量
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum f = lazy_sum(1, 3, 5, 7, 9) f() # 执行
匿名函数
lambda 参数:表达式
表达式为返回值
装饰器
在代码运行期间动态增加功能的方式
import functools # 在函数调用前后自动打印日志,但又不希望修改now()函数的定义 def log(func): @functools.wraps(func) # 把原始函数的__name__等属性复制到wrapper()函数中 def wrapper(*args, **kw): print('call',func.__name__) # 打印日志 return func(*args, **kw) # 调用原函数 return wrapper @log # 把@log放到now()函数的定义处,相当于执行了语句now = log(now) def now(): print('function:now')
decorator本身需要传入参数
import functools def log(text): def decorator(func): @functools.wraps(func) # 把原始函数的__name__等属性复制到wrapper()函数中 def wrapper(*args, **kw): print(text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print('2015-3-25')
偏函数
functools.partial()
把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数
import functools int2 = functools.partial(int, base=2) int('1000000',2) # 按二进制转化为int int2('1000000')
Python内置函数
staticmethod
返回函数的静态方法(静态方法可以不需要实例化)
class c(): @staticmethod def f(): pass # 无需实例化调用 c.f() # 实例化调用 c = C() c.f()