1. 발전기 #은 기본적으로 이터레이터
1.1 발전기가 내장되어 있습니다
발전기를 만들 수 파이썬의 세 가지 방법이 있습니다 :
1. 함수 발생기
2. 발전기 유도
내장 함수 나 모듈 3.python
1.2 함수 생성기
우리가 먼저 발생 기능에 의해 생성 된 건물을 검사합니다.
def func():
print(11)
return 22
ret = func()
print(ret)
# 运行结果:
11
22
수율로 반환하는 함수, 그렇지 FUNC 함수 아니라 함수 발생기 있도록
def func():
print(11)
yield 22
우리는 이유입니다, 변경 사항을 작성하지 않은?의 괄호 안에 함수 이름을 취득한 것을 보자?
def func():
print(11)
yield 22
ret = func()
print(ret)
# 运行结果:
<generator object func at 0x000001A575163888>
우리가 키워드 수율의 실행, 그리고 우리가 빌더를 선언 할 것을 발견했을 때 함수 본문 코드의 기능이 실행됩니다. 호출 할 때 Builder 프로그램은 우리에게 수익을 줄 것이다
빌더는 기본적으로 이터레이터 반복자 값이 어떻게 발생을 소중히하는 방법.. 따라서 직접 수행 할 수있는 다음 () 또는 ** _ _ _ _ 다음 () ** 발전기하기 방법
def func():
print("111")
yield 222
gener = func() # 这个时候函数不会执⾏. 而是获取到生成器
ret = next(gener) # 这个时候函数才会执行 推荐使用next()
#ret = gener.__next__() # 这个时候函数才会执行
print(ret) # 并且yield会将func生产出来的数据 222 给了 ret。
结果:
111
222
그리고 내 생성 기능은 더 수율로 쓸 수 있습니다.
def func():
print(11)
yield 22
print(33)
yield 44
print(func().__next__()) #启动了一个生成器
print(func().__next__()) #启动了另一个生成器
# 运行结果:
11
22
11
22
def func():
print("111")
yield 222
print("333")
yield 444
gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__()
# 最后⼀个yield执⾏完毕. 再次__next__()程序报错 StopIteration异常
print(ret3)
프로그램이 수율의 마지막을 실행하면 뒤에 계속 실행 다음 반복자처럼, 다음, 다음 수율의 수를 초과, 그것은 오류가 발생하지 수율에 해당하는 () 프로그램이 제공됩니다.
양보하고 차이를 반환 :
일반적으로 리턴 기능 그의 역할은 기능을 종료하는 것이며, 함수의 실행의 반환 값에, 하나 제공됩니다.
복수로 제공 될 수있다 발전기 함수를 산출하고, 그 기능을 종료하지 않는 것으로, 다음 해당 취득 소자 생성 수득한다.
시나리오 :
우리는이 수요를 보면 : 보스 아래층 만두를 판매하는 늙은 소년 바 오즈 푸 보스가 진짜입니다 만 개 만두를 주문, 그들은 밖으로 일 모든 것이다.
def eat():
lst = []
for i in range(1,10000):
lst.append('包子'+str(i))
return lst
e = eat()
print(e)
이렇게하면 아무 문제 없지만, 학생들이 너무 많은, 약 2000를 먹고, 8000의 나머지, 우리는 단지 옆으로 넣어 공간을 달성 할 수 있기 때문에 우리는하지 않았다. 바 오즈 푸 보스 효율이 충분히 높은 경우에, 나는 롤빵을 먹고, 당신이 롤빵은, 그것은 너무 많은 저장 공간과 완벽한을 차지하지 않습니다.
def eat():
for i in range(1,10000):
yield '包子'+str(i)
e = eat()
for i in range(200):
next(e)
둘 사이의 차이 :
첫 번째는, 모두의 만두에 직접 할 메모리를 가지고하는 것입니다.
두 번째는 매우 메모리 절약을 만들어 먹을 수있다,뿐만 아니라 이전 위치를 유지합니다.
def eat():
for i in range(1,10000):
yield '包子'+str(i)
e = eat()
for i in range(200):
next(e)
for i in range(300):
next(e)
# 多次next包子的号码是按照顺序记录的。
1.3 전송 방식 (이해)
다음으로 우리는 사물에 대한 새로운 이해에 와서, 방법을 보내
# next只能获取yield生成的值,但是不能传递值。
def gen(name):
print(f'{name} ready to eat')
while 1:
food = yield
print(f'{name} start to eat {food}')
g = gen('alex')
next(g)
next(g)
next(g)
# 而使用send这个方法是可以的。
def gen(name):
print(f'{name} ready to eat')
while 1:
food = yield 222
print(f'{name} start to eat {food}')
g = gen('alex')
next(g) # 第一次必须用next让指针停留在第一个yield后面
# 与next一样,可以获取到yield的值
ret = g.send('骨头')
print(ret)
结果:
alex ready to eat
alex start to eat 骨头
222
def gen(name):
print(f'{name} ready to eat')
while 1:
food = yield
print(f'{name} start to eat {food}')
g = gen('alex')
next(g)
# 还可以给上一个yield发送值
g.send('骨头')
g.send('狗粮')
g.send('香肠')
()의 차이를 보내고 다음 :
같은 점 :
발전기는 회 하방 대응 수득 할 수 있도록 ()를 전송하고 다음으로.
얻을 수 수율 값이 생성된다.
차이 :
제 취득 수율 값은 ((없음)을 보낼 수있다) 전송할 수없는 경우 다음에 사용될 수있다.
설정 값이 전송 수득 전송할 수있다.
수율 1.4
python3 될 수있는 데이터 객체의 각각의 반복을 직접 제공하는 결과 발전기로서 리턴
# 对比yield 与 yield from
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield lst
g = func()
print(g)
print(next(g)) # 只是返回一个列表
结果:
<generator object func at 0x0000018C18AB94F8>
['卫龙', '老冰棍', '北冰洋', '牛羊配']
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield from lst
g = func()
print(g)
# 他会将这个可迭代对象(列表)的每个元素当成迭代器的每个结果进行返回。
print(next(g))
print(next(g))
print(next(g))
print(next(g))
结果:
<generator object func at 0x00000213E7D194F8>
卫龙
老冰棍
北冰洋
牛羊配
'''
yield from ['卫龙','老冰棍','北冰洋','牛羊配']
等同于:
yield '卫龙'
yield '老冰棍'
yield '北冰洋'
yield '牛羊配'
구덩이에서 1.5 수율
def func():
lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
lst2 = ['馒头', '花卷', '豆包', '大饼']
yield from lst1
yield from lst2
g = func()
for i in g:
print(i)
结果:
卫龙
老冰棍
北冰洋
牛羊配
馒头
花卷
豆包
大饼