Python 初学笔记 - 第二章-生成器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 初学笔记 - 第二章-生成器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2543字,纯文字阅读大概需要4分钟。
内容图文
目录可迭代对象
可以直接被 for 循环的对象称为可迭代对象(Iterable),意思就是可遍历的。
from collections.abc import Iterable, Iterator
for i in 'abc':
print(i)
print(issubclass(str, Iterable))
print(issubclass(str, Iterator))
a
b
c
True
False
迭代器
可以被 next() 函数调用(也就是实现了 __iter__ 和 __next__ 方法)并不断返回下一个值的对象称为迭代器(Iterator),迭代器都
是可迭代对象,迭代器是访问元素集合的一种方式,访问时调用 next() 的时候才返回下一个值,如果容器中没有更多元素了,则抛出 StopIteration
异常,所以它是惰性计算序列,更节省空间。
from collections.abc import Iterable, Iterator
# 迭代器
class Foo:
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
# print('iter')
return self
def __next__(self):
# print('next')
self.curr, self.prev = self.prev + self.curr, self.curr
return self.curr # 需要返回值给 i
foo = Foo()
for i in foo:
if i > 20:
print(i)
break
print(i)
print(next(foo))
print(issubclass(Foo, Iterable))
print(issubclass(Foo, Iterator))
1
2
3
5
8
13
21
34
True
True
生成器
生成器(generator)都是迭代器的对象,所以本质上还是一个迭代器,但是不需要自己像实现迭代器一样自己去实现__iter__和__next__
方法,因为说过迭代器是一种访问元素的方式所以需要自己实现,而生成器是一个属于generator类,内部已经实现两个内置方法,也就是说生成器使
用较于迭代器更简洁与高效。
from collections.abc import Iterator
a = [i for i in range(10)]
b = (i for i in range(10))
print(f'列表生成式:{a}')
print(f'生成器:{b}')
print(next(b))
print(next(b))
print(issubclass(type(a), Iterator))
print(issubclass(type(b), Iterator))
列表生成式:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器:<generator object <genexpr> at 0x03555470>
0
1
False
True
函数生成器
生成器就是把算法保存在生成器里面,每调用一次,里面的循环才会执行一次然后中断并返回值,不像的普通的循环一样需要等到循环执行完毕才返回。
函数生成器和生成器使用起来也是没有什么区别,但是函数生成器需要显示的使用 yield 关键字定义,在关键字后面跟需要返回的变量。
def Foo():
prev = 0
curr = 1
while True:
curr, prev = prev + curr, curr
yield curr
foo = Foo()
print(foo)
while True:
i = next(foo)
if i > 20:
print(i)
break
print(i)
print(next(foo))
print(next(foo))
<generator object Foo at 0x03645470>
1
2
3
5
8
13
21
34
55
函数生成器传参
函数生成器内部需要用 yield 进行接收参数,生成器对象使用 generator.send(arg) 进行传参,调用send(x)给生成器传值时,必须确保生成器已
经执行过一次next()调用,这样会让程序走到yield位置等待外部第2次调用。
generator.send(None)
next(generator)
def Foo():
n = yield
for i in range(n):
yield i
foo = Foo()
next(foo)
foo.send(10)
print(next(foo))
print(next(foo))
1
2
内容总结
以上是互联网集市为您收集整理的Python 初学笔记 - 第二章-生成器全部内容,希望文章能够帮你解决Python 初学笔记 - 第二章-生成器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。