python-列表生成式、生成器、迭代器、可迭代对象区别

列表生成式 就是for的嵌套 实打实的生成全部【】

a = [n for n in range(1,5)]
a # [1,2,3,4]

生成器 采用惰性触发 是迭代器的一种 ()

列表生成式 只要一执行就生成全部的元素
元组生成器只有触发时才生成一个,相当于游标一直向下移动,直到stopIteration
(n for n in range(1,5))

def num(min,max):
	for i in range(min,max):
		yield i
a = num()#返回一个生成器对象而非调用
#调用方式1
a = num.send(None)#也可对返回值进行处理send('result') result5 这样连接
#调用方式2
next(a)
#等价
a.__next__()
#调用方式3
for i in num:
	print(i)
  • 单独谈谈send的使用规则
    同next一样可以获得一个生成器元素内容,而且可以对 temp = yield i temp返回传入的值
    但是
    (1).第一次使用生成器的时候 是用next获取下一个值

(2).最后一个yield不能接受外部的值

def num():
    i = 0
    for i in range(5):
        temp = yield i
        print("-"+str(temp))


a = num()
# for i in num():
#     print(i)

next(a)
print(a.send("resu"))#不能获取第一个生成器对象使用 他既可以返回生成器当前元素内容 游客对yield赋值
print(a.send("resu"))
print(a.send("resu"))
print(a.send("resu"))
print(a.send(None))
  • 生成器和拆包语法实现斐波那契数列
def fiber():
	a,b=0,1
	for i in range(5):
		yield (b)# 停止 和 返回b
		a,b = b,a+b

a = fiber()
print(next(a))

  • 使用生成器实现协程多任务
def func1():
    while True:
        print("1")
        yield 1
def func2():
    while True:
        print("2")
        yield 2

f1=func1()
f2=func2()
while True:
    f1.__next__()
    f2.__next__()
  • 运行结果
    反复 1 2 1 2 …

迭代器 可以使用next这种方法生成结果 只能向前 用一个才生成一个 节省内存

  • 生成器就是迭代器 而可迭代的字符串 列表 元组 字典不是迭代器
  • 迭代器可以使用for循环 这样可以不奔溃但是遍历出所有的值
def fiber():
	a,b=0,1
	for i in range(5):
		yield (b)# 停止 和 返回b
		a,b = b,a+b

for i in  fiber():
	print(i)

可迭代对象 包括能for循环 和 生成器

#判断是否为可迭代对象
from collections import Iterable
isintance([],Iterable)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章