装饰器:
器:代表函数
装饰:装饰其他函数
装饰器原则:
不能修改被装饰函数的源代码
不能修改被装饰函数的调用方式
实现装饰器:
1 函数即变量 (匿名函数没有函数名,使用完就会被回收)
2 高阶函数
a:把一个函数名当做实参传给另外一个函数
b:返回值中包含函数名
3 嵌套函数
a:在函数体内用def声明一个函数
4 闭包:函数接受的参数可以传递给内嵌函数里
一个简单的装饰器:
def timer(func):
def test2(*args): # 可变参数能接收不一样的环境
start_time = time.time()
func(*args)
end_time = time.time()
print("时间间隔是: --> %s " % (end_time - start_time) )
return test2 # 返回的一定是函数名, 不能带(), 否则会出错
@timer
def test1():
time.sleep(3)
print('in test1')
用法:
在要被装饰的函数前加上@装饰器名, 这句话相当于test1 = timer(test1)
列表生成式:
[ i*i for i in range(10) ]
生成器:
分为列表生成器和函数生成器
注意, 生成器只能迭代一次, 使用完了就完了, 在处理超大数据的时候合适
列表生成器:
将列表生成器的中括号换成小括号
( i*i for i in range(10) )
与list的区别;
调用时候才生成, 特别快, 不使用不占内存
不支持切片
只记录当前位置, __next__()方法
函数生成器:
yield:返回一个值, 此时程序等待下次调用, 处于挂起状态
send:可以给yield传值
生成器的例子:
import time def consumer(name): print("ready for beef") while True: beef = yield print("beef %s comes, eaten by %s" % (beef, name)) def producer(name): c1 = consumer('A') c2 = consumer('B') c1.__next__() c2.__next__() print("doing meet beef") for i in range(3): time.sleep(1) print("1 beef made, 2 copule") c1.send(i) c2.send(i) producer("hinimix")
迭代器:
生成器是迭代器(Iterator), list,dict,str是可以迭代的, 但是不是迭代器
迭代器转换iter()
注意
凡是可作用与for循环的都是Iterable类型
凡是可作用于next()函数的对象都是Iterator类型,