文章目录
- python推导式
- python可迭代对象(iterable)
- 迭代器(iterator)
- 生成器(genatator)
- 总结
一、python推导式
1、列表推导式
a = [1,2,3,4,5,6,7]
b = [x for x in a if x % 2 == 1]
print(b)
2、字典推导式
d1 = {"a":1, "b":2}
d2 = {v:k for k,v in d1.items()}
print(d2)
3、集合推导式:和列表推导式差不多,只不过使用{},自动去重
a = [1,-1,2,1]
b = {i*i for i in a if i in a}
print(b)
二、python可迭代对象
能被for循环的都是可迭代对象
实现了__iter__方法,并且该方法返回一个迭代器的对象
lst = ["x","y",1,2,3]
print(dir(lst))
三、迭代器(iterator)
实现了__iter__和__next__方法的都叫迭代器;
__iter__方法返回自身;
__next__方法返回下一个值。
在for循环中,for先调用可迭代对象__iter__方法,返回一个迭代器,然后再对迭代器调用__next__方法,直到最后一个退出。
迭代器是懒加载,惰性求值,需要的时候在生成。
四、生成器(genatator)
生成器它不需要手动实现__iter__和__next__方法;
是迭代器更优雅的写法。
生成器有两个写法:a生成器表达式 b生成器函数。
a生成器表达式:
生成器表达式类似于列表推导式,只不过使用()。
例:
result = (x for x in range(1,31) if x % 3 == 0)
print(result)
print(dir(result))
b生成器函数:
包含了yield关键字的函数就叫做生成器函数
例:
def get_content():
x = 2
yield x
y = 3
yield y
z = 4
yield z
g = get_content()
print(g)
print(dir(g))
#第一次执行next的时候,遇到yield就退出,并且返回yield后面携带的参数,还会记录之前的位置
print(next(g))
#第二次执行的时候就会从上一次执行的地方继续执行
print(next(g))
print(next(g))
例题:
用生成器函数实现斐波拉契数列
def func1():
o, t = 0, 1
while 1:
yield t
o, t = t, t + o
u = func1()
for i in range(1,8):
print(next(u))
yield与return的比较
* 相同点:都可以返回一个值,值的类型和个数没有限制
* 不同点:yield返回的值可以保存返回值的状态,可以多次返回
Return返回值只能返回一次,函数就会退出
五、总结
迭代对象、迭代器、生成器的区别
- 可直接作用于for循环的对象称为可迭代对象,可迭代对象实现了__iter__()方法。
- 迭代器则是实现了__iter__()和__next__()方法的对象,可以显示地获取下一个元素。
- 生成器是特殊的迭代器,生成器返回一个迭代器,生成器中包含yield关键字,相当于一个断点,执行到此返回一个值后暂停,从而实现next取值。