摘要:在Python语言的学习中,通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。如果列表元素可以按照某种算法推算出来,用到才创建,在 Python语言中这种称为生成器:generator。就像厨师一样,用到了才做菜。
Python 生成器
列表生成式
a = [x for x in range(10)]
print(type(a))
print(a)
运行结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
再来一个例子:
a = [x*2 for x in range(10)] # 先执行 x in range(10) 得出的每个值,再依次计算 x * 2 最后组成一个列表。
print(a)
运行结果:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。如果列表元素可以按照某种算法推算出来,用到才创建,在 Python 中这种称为生成器:generator。就像厨师一样,用到了才做菜。
创建生成器方法一:
a = (x for x in range(4))
print(a) # 打印 a 的类型 generator object
print(a.__next__()) # 获取生成器的第一个值 __netx__() 这个特殊方法不建议使用
print(next(a)) # 获取生成器的下一个值, 等价于 a.__next__(); python 2.x 用 a.next() 方法
print(next(a))
print(next(a))
print(next(a)) # 当生成器的值取完后,会报 StopIteration 错误
运行结果:
<generator object
0
1
2
3
StopIteration
创建生成器方法二:
def foo():
print('ok')
yield 1 # 返回一个 1
a = foo()
print(a) # 打印类型
b = next(a) # 获取返回值,执行 next(a)的时候执行了 print('ok')
print(b)
运行结果:
ok
1
使用 for 迭代生成器
注:可迭代对象是指拥有 iter 方法的对象。例如: 列表,元组,字典
a = (x for x in range(4))
for i in a:
print(i)
运行结果:
0
1
2
3
斐波拉契数列
def fib(max):
n, before, after = 0, 0, 1
while n < max:
yield after # 返回一个 after 值
before, after = after, before + after # 这里会优先计算出右边的表达式的结果:
# 第一次循环时 before, after = 1, 1
n += 1
res = fib(5) # 生成一个生成器
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
运行结果:
1
1
2
3
5
使用 send 方法传入参数
def bar():
print('ok1')
count = yield 1 # 先返回 1 后,从 send 中接收 8 赋值给变量 count
print(count)
print('ok2')
yield 2
b = bar()
#b.send(None) # 跟 next(b) 作用一样,第一次 send 前如果没有 next, 只能传一个 send(None)
print(next(b)) # 打印 yield 1 返回的 1
b.send(8) # send(8) 进入 yield 1 处,把 8 赋值给 count
运行结果:
ok1
1
8
ok2
希望这篇文章可以帮助到你,总之同学们,it资讯尽在职坐标。
擅长针对企业软件开发的产品设计及开发的细节与流程设计课程内容。座右铭:大道至简!
已有23人表明态度,87%喜欢该老师!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号