python函数
一.函数的定义、参数、返回值
二.函数变量
注意:函数的作用域只跟函数声明时定义的作用域有关,跟函数的调用位置无任何关系
三.匿名函数
形式:lambda 变量:返回值
一般配合高阶函数使用
a = lambda x:x+1 # a --> 得到内存地址 a(3) # 执行函数,得到4
四.高阶函数
五.内置函数
六.Python三大器
迭代器
概念:迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样),每次迭代的结果都是下一次迭代的初始值。
可迭代对象:对象.__iter__()方法(或者iter(对象)),执行后得到的结果是迭代器对象。
迭代器对象:内置__iter__()和__next__() <==>等价于 iter(对象)、next(对象)。
注:①迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象;
②迭代器.__iter__()得到的仍然是迭代器本身;
for循环本质
①将可迭代对象用__iter__方法转换成迭代器对象;
②然后执行__next__;
③到结束捕捉异常,退出循环;
优缺点
优点
--- 提供一种统一的、不依赖于索引的迭代方式;
--- 惰性计算,节省内存;
缺点
--- 无法获取长度(只有在next完毕才知道到底有几个值)
--- 一次性的,只能往后走,不能往前退
生成器
三元表达式:res = 结果1(一元) if 条件(二元) else 结果2(三元)
列表生成式:res = [i**3 for i in range(10) [if 条件] ]
生成器表达式:
将列表生产式中 [] 改成 (),就表示生成器
生成器函数
将返回return改成yield,就表示生成器函数
特点
1.生成器本身就是一个迭代器
2.对比return,可以返回多次值,可以挂起/保存函数的运行状态
装饰器
不带参数的装饰器
1 import time 2 import functools 3 4 5 def deco(func): 6 @functools.wraps(func) 7 def wrapper(*arg,**kwargs): #表示传入可变参数 8 start_time=time.time() 9 res=func(*arg,**kwargs) 10 end_time=time.time() 11 print('运行时间是%s' % (end_time-start_time)) 12 return res 13 return wrapper 14 15 @deco #等价于 func=deco(func) 16 def func(x,y,z): 17 time.sleep(2) 18 print('hello world %s %s %s'% (x,y,z)) 19 20 func(1,2,3)
带参数的装饰器
1 from functools import wraps 2 def logging(level): 3 def wrapper(func): 4 @wraps(func) 5 def inner_wrapper(*args, **kwargs): 6 print("[{level}]: enter function {func}()".format( 7 level=level, 8 func=func.__name__)) 9 print(func.__doc__) 10 return func(*args, **kwargs) 11 return inner_wrapper 12 return wrapper 13 14 15 @logging(level='INFO') 16 def say(something): 17 """say.......""" 18 print("say {}!".format(something)) 19 20 21 # 如果没有使用@语法,等同于 22 # say = logging(level='INFO')(say) 23 24 @logging(level='DEBUG') 25 def do(something): 26 """do.......""" 27 print("do {}...".format(something)) 28 29 30 if __name__ == '__main__': 31 say('hello') 32 do("my work")
装饰器原则:
1.不修改被装饰对象的源代码.
2.不修改被装饰对象的调用方式.
装饰器的基本形式:
1 from functools import wraps 2 3 def wapper(func): 4 # @wraps(func) # 表示将原函数的信息保留 5 def inner(*args,**kwargs): 6 # 函数执行前操作 7 ret = func() 8 # 函数执行后执行 9 return ret 10 return inner 11 12 13 @wapper # func=wapper(func) 14 def func(): 15 print(func.__name__) 16 # 无wraps(func)打印inner 17 # 有wraps(func)打印func 18 19 20 func()