고급 기능 - 발전기

다이애나는 키워드를 얻을 수

수율 키워드가 기능에 표시 한 다음 함수를 호출 할 때마다 생산을 의미하는 영어 단어의 수율은, 함수 본문 코드를 계속 실행되지 않지만 값을 반환합니다.

def func():
    print(1)
    yield
    print(2)
    yield

g = func()
print(g)

<generator object func at 0x10ddb6b48>
발전기는 또한 단지 반복자, 본질적으로 반복자이지만, 반복자는 정말 작은 이외의 사용, 그래서 우리는 자랑스럽게 말할 수있다 : 발전기는 자기 정의 반복자의 매우 편리한 방법을 제공합니다. 그리고 파이썬 2.5+, 시작 : 발전기는 더 많은 작업을 완수 할 수 있다는 것을 의미 발전기에 더 많은 기능을 추가함으로써 달성 [PEP 342 생성기 강화 프로그램을 통해 시너지 효과를 달성]. 이 섹션에서 우리는 섹션의 뒷부분에 소개합니다.

def func():
    print('from func 1')
    yield 'a'
    print('from func 2')
    yield 'b'

g = func()
print(F"g.__iter__ == g: {g.__iter__() == g}")

res1 = g.__next__()
print(f"res1: {res1}")

res2 = next(g)
print(f"res2: {res2}")

# next(g)  # StopIteration

g.__iter__ == g: True from func 1 res1: a from func 2 res2: b

def func():
    print('from func 1')
    yield 'a'
    print('from func 2')
    yield 'b'


g = func()
for i in g:
    print(i)

print(f"list(func()): {list(func())}")

from func 1 a from func 2 b from func 1 from func 2 list(func()): ['a', 'b']

1.1 수율과 두 번째 선거를 반환

함수 발생기는 함수이기 때문에, 복귀 출력 반환 값을 사용합니까?

당신이 발전기로 사용자 정의 기능을 선택했기 때문에 프로, 또한 당신은 일을 돌려주는? 이것은 Python2, 파이썬 인터프리터는 당신에게 예외를 제시하지만, Python3에서, 그는 또한 여부 바보 같은 행동 경우.

def i_wanna_return():
    yield 'a'
    yield 'b'
    return None
    yield 'c'

for i in i_wanna_return():
    print(i)

a b

1.2 반복자 슬리브 반복자

내가 발전기의 반복적 인 과정 반복적는 다른 발전기에 액세스해야하는 경우 어떻게 할까? 그래서 바보 매우 순진 아래 글. 그리고 무엇을 의도하는 것은이 작업을 수행하는 것입니다? ? ?

def sub_generator():
    yield 1
    yield 2
    for i in range(3):
        yield i

for i in sub_generator():
    print(i)

1 2 0 1 2

def sub_generator():
    yield 1
    yield 2
    yield from range(3)

for i in sub_generator():
    print(i)

1 2 0 1 2


다이애나이 개 협력 프로그램

코 루틴 (coroutine이)는 일반적으로 기능을 의미한다 :

 * 각 다른 하나는 서로 다른 지역 변수, 명령 포인터,하지만 여전히 공유 전역 변수가
 * 쉽게 이력서를 일시 중단 할 수 있으며, 입구와 출구 지점의 복수
 * 같은 A와 협력의 성능을 실행중인 프로그램, 복수 간의 시너지 효과 과정은 B의 결과의 이행을 계속하기 위해 실행해야
순간의 특성을 결정 코 루틴 만 조정 프로그램 (멀티 스레드의 대소)을 실행한다. 이 덕분에, 코 루틴처럼, 활성 공동 수면을위한 필요없이 잠금 또는 기타 직접 웨이크 업 과정을 자원에 관계없이 객체간에 직접 전달 될 수있는 내장 잠금 스레드. 코 루틴의 특성에 맞춰 시나리오에서 코 루틴을 사용하는 것은 의심 할 여지없이 스레드를 사용하는 것보다 더 편리 할 것입니다.

반면에, 동시 코 루틴은 사실이 기능은 오히려 실보다 더 많은 기존의 기능과 비교하게되는 코 루틴을 만드는, 매우 좁은 범위에서 현장에의 적용을 제한하지. 물론, 많은 스레드가 동시 루틴보다 더 복잡하고, 더 강력한, 그래서 당신이 단단히 스레드가, 그를 제어하지 않는, 동시 프로그래밍은 당신이 그를 재 학습 것이기 때문에보기 무지 힘을 듣고되지 파악할 수 있음을 시사한다. 따라서이 절에서는 I 코 루틴의 예를 열거되지 않으며, 후술하는 방법을 이해하기.

Python2.5 + 인핸스먼트 발생기 다른 특징 코 루틴을 구현하기 때문에,이 버전에서, 상기 발전기의 첨가하는 방법

2.1 전송 (값)

또한 상기 방법은 다른 회수 발생기를 보내 다음이다. Python2.5 +에서, 당신이 지금 항복 값을 가질 수 있음을 의미하고,이 값이 실행 메소드 매개 변수는 메소드 호출 생성기를 보내기 복원에 호출 할 수있는 수율 표현에 항복 문.

def h():
    print('--start--')
    first = yield 5  # 等待接收 Fighting! 值
    print('1', first)
    second = yield 12  # 等待接收 hahaha! 值
    print('2', second)
    yield 13
    print('--end--')


g = h()
first = next(g)  # m 获取了yield 5 的参数值 5
# (yield 5)表达式被赋予了'Fighting!',  d 获取了yield 12 的参数值12
second = g.send('Fighting!')
third = g.send('hahaha!')  # (yield 12)表达式被赋予了'hahaha!'
print(f'--over--')
print(f"first:{first}, second:{second}, third:{third}")

--start-- 1 Fighting! 2 hahaha! --over-- first:5, second:12, third:13

  • 비 없음 값 전에 수신 전화를 보내기, 발전기, 그렇지 않으면 예외가 발생합니다, 일시 중단 된 상태에 있어야합니다. 그러나, 여전히 송신 호출로 없음을 사용할 수 없습니다 발전기를 시작하지 않습니다.
  • 당신이 다음 회수 발생기를 사용하는 경우, 항복 식의 값은 아무도 없을 것입니다.

    2.2 확대 ()

    이 방법은 발전기를 닫는 데 사용된다. 전화 또는 StopIteration을 오른쪽으로 올릴 것이다 다음 세대를 닫 다시 보냅니다.
def repeater():
    n = 0
    while True:
        n = (yield n)

r = repeater()
r.close()
print(next(r))  # StopIteration

2.3 드로우 (타입 값 = 없음, 추적 = 없음)

인터럽트 발생기는 매우 유연 기술은 발전기를 종료하는 GeneratorExit 쓰 통해 예외를 발생시킬 수있다. 이 (GeneratorExit)의 투사라고 내에서 close () 메소드는, 사실, 같은 일을한다. 우리는 소스 코드의 닫기를 참조하십시오

def close(self):
    try:
        self.throw(GeneratorExit)
    except (GeneratorExit, StopIteration):
        pass 
    else:
        raise RuntimeError("generator ignored GeneratorExit") # Other exceptions are not caught


물 및 사용자 범위 () 메소드

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += 1

g = my_range(0, 3)
print(f"list(g): {list(g)}")

list(g): [0, 1, 2]

네 다이애나 요약

수율 :
 1. 사용자 정의 반복자 방식으로 제공하는
 2.yield 라이브 일시 정지 기능을, 현재의 반환 값을 제공
수율 및 반환 :
 두 함수가 값을 반환 할 수 있습니다, 내부적으로 사용된다 : 1. 유사성을 및 반환 값의 종류와 수를 제한하지 않습니다
 , 수율이 여러 값을 반환 할 수 있습니다 한번 유일한 수익의 반환 : 2. 다른 점


다섯 개 다이애나 발전기 표현

 * 유래 화학식 (포함)의리스트가 생성 표현
 * 장점 : 메모리 저장 값이 메모리에 한 번만 발생한다

t = (i for i in range(10))
print(t)
print(f"next(t): {next(t)}")

<generator object <genexpr> at 0x1101c4888> next(t): 0

식의 표현의 목록과 유도를 생성

목록 함축 직접 당신에게 계란 바구니의 등가를 제공하고, 해당 표현이 당신에게 오래된 암탉을 줄 생성합니다.

# 生成器表达式
with open('52.txt', 'r', encoding='utf8') as f:
    nums = [len(line) for line in f]

print(max(nums))

1

# 列表推导式
with open('52.txt','r',encoding='utf8') as f:
    nums = (len(line) for line in f)

print(max(nums)) # ValueError: I/O operation on closed file.

추천

출처www.cnblogs.com/suren-apan/p/11374764.html