1.装饰器
1. 不能修改被装饰的函数的源代码
2. 不能修改被装饰的函数的调用方式
实现装饰器知识储备:
1 函数即“变量”
2 高阶函数
a:把一个函数名当做实参传给另外一个函数(不修改被装饰函数源代码)
b:返回值中包含函数名(不修改函数的调用方式)
3嵌套函数
装饰器 想了很久过两天代码实现
:
列表生成式:
a=[i if i<5 else i*i for i in a]
2.生成器
为什么会有这个功能?
答:我们可以使用列表储存数据,可当我们的数据特别大的时候,建立了列表是很占内存,生成器他可以先创建数据,但不用,你需要时用,要几个拿几个。
A简单的生成器
a=( x for x in range(10)) next(a) #写一次next输出一个数
next(a)会一直表示出a中数据直到没有,且不可以回退。
B.用函数写的生成器
yield
b把函数的执行过程冻结在这一步,并且把b的值,返回给外面的next()
next()唤醒冻结的函数
代码如下:
def fib(max) : n,a,b=0,0,1 while n<max: print("nice") yield b a,b=b,a+b n+=1 return ‘done‘ f=fib(15) next(f)
代码执行到yield b 这里停了,外面调用一次next(f),继续走。再次调用 会继续走,直到遇到下一个yield 通过next()唤醒。
运行到完程序会报错,这是正常的。
函数有了YIELD之后
1.函数名加()就得到了一个生成器
2.return在生成器里,代表生成器的中止,直接报错
2.生成器send方法
A.唤醒并继续执行
B.发送一个信息到生成器内部
代码如下:
def range2(n) : count=0 while count<n: print(count) count+=1 sign=yield count if sign=‘stop‘ : print(sign) return 1111 new_range=range2(3) new_range.send("stop")
程序走到yield 返回消息到外面可next 可接受 send的消息 作出继续或停止的操作。
3.迭代器(可循环的)
可以使用isinstance()判断一个对象是否是iterable对象
iterable可迭代类型
isinstance(1.iterable) isinstance(‘abc‘,iterable) #结果是:false true
迭代器:可以被next()函数调用并不断返回下一个值得对象成为迭代器 iterator
所有生成器也是迭代器
为什么:list,str dict是可迭代对象,但却不是迭代器?
python中,iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时STOPITERATION错误,可以把这个数据流,看作是一个有序序列,但是我们却不可以提前知道序列的长度,只能不断通过next()函数实现 按需计算下一个数据,所以iterator的计算式惰性的,只有在需要返回 下一个数据时,他才会计算,而dict,list这些都是有大小,长度的所以不是iterator1
原文地址:https://www.cnblogs.com/lchh/p/9386644.html