백만 연봉 파이썬 도로 - day12 - 발전기

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)
    
结果:
卫龙
老冰棍
北冰洋
牛羊配
馒头
花卷
豆包
大饼
첫 번째 목록의 모든 요소를 ​​한 후 결과가 두 번째 목록 반환 반환 반환

2.

추천

출처www.cnblogs.com/zhangchaoyin/p/11221236.html