비동기식 IO-Associal Review yield from

3533 단어 python
먼저 yield와 yield form의 차이가 어디에 있는지 살펴보자. 코드는 다음과 같다. 모두range(10)에 전송된다.
def g1(iterable):
    yield iterable

def g2(iterable):
    yield from iterable

for value in g1(range(10)):
    print(value)

for value in g2(range(10)):
    print(value)

결과:yield가 출력한 것은range(10)이고,yieldfrom은 그의 교체 데이터를 출력했다.
range(0, 10)
0
1
2
3
4
5
6
7
8
9

yieldfrom을 배우기 전에 라이브러리를 알아야 한다. chain, 이 라이브러리는 임의의 여러 개의 데이터를 교체할 수 있다.list,dict, 등을 포함한다.
from itertools import chain 

my_list = [1,2,3]

my_dict = {
    "bobby":"http://project.com",
    "bobby2":"http://www.immoc.com"

}
for value in chain(my_dict,my_list,range(5,10)):
    print(value)

그것이 실현한 기능은 이렇다. 그 중의 데이터를 하나하나 교체해 내다
bobby
bobby2
1
2
3
5
6
7
8
9

이제 우리 스스로 찬이를 이루자.
#      chain
def my_chain(*args,**kwargs):
    for my_iterable in args:
        for value in my_iterable:
            yield value

for value in my_chain(my_dict,my_list,range(5,10)):
    print(value)

발생하는 값도
bobby
bobby2
1
2
3
5
6
7
8
9

지금은요.
def my_chain(*args,**kwargs):
    for my_iterable in args:
        yield from my_iterable  # yield from           
for value in my_chain(my_dict,my_list,range(5,10)):
    print(value)

생성된 결과는 다음과 같다. yieldfrom은 위의 코드를 간소화했다. 사실 yieldfrom은 모든 데이터를 교체하는 데 그치지 않고 내부에 많은 이상 처리를 실현했다.
bobby
bobby2
1
2
3
5
6
7
8
9

그리고 yieldfrom의 사용 방법을 사용하면 호출자와 하위 생성기 사이에 양방향 채널을 만들어 연결을 실현할 수 있습니다
def g1(gen):
    yield from gen

def main():
    g = g1()
    g.send(None)

# main     g1(     ),gen    
# yield from                     

이것은 일드 프롬의 실전 예인데,

final_result = {}


def sales_sum(pro_name):
    total = 0
    nums = []
    while True:
        x = yield
        print(pro_name+"  :",x)
        if not x:
            break
        total+=x
        nums.append(x)
    return total,nums



def middle(key):
    while 1:
        final_result[key] = yield from sales_sum(key)
        print(key+"      !")



def main():
    data_set = {
        "bobby   ":[1200,1500,3000],
        "bobby   ":[1600,1700,13000,1200],
        "bobby   ":[2300,2100,10,60]
    }
    for key,data_set in data_set.items():
        print("start key",key)
        m = middle(key)
        m.send(None) #    middle  
        for value in data_set:
            m.send(value) #           
        m.send(None)
    print("final_result",final_result)

"""
#     
"""
def sales_sum1(pro_name):
    total = 0
    nums = []
    while True:
        x = yield
        print(pro_name+"  :",x)
        if not x:
            break
        total+=x
        nums.append(x)
    return total,nums



if __name__ == '__main__':
    my_gen  =sales_sum1("boobby   ")
    my_gen.send(None)
    my_gen.send(1000)
    my_gen.send(1300)
    my_gen.send(1200)
    try:
        my_gen.send(None)#    ,        
    except StopIteration as e:#       
        result = e.value
        print(result)  # yield from               

그것이 최종적으로 실현된 효과는 이렇다. 모두가 위의 코드를 복사하여 IED에 가서 스스로 분석하고 실행할 수 있다.이것은 위에 있는 Yield from의 사용 방법과 관련이 있다.호출자, 위탁 생성기와 하위 생성기와 관련이 있고 하위 생성기는 호출자와 양방향 채널을 실현할 수 있다.
boobby     : 1000
boobby     : 1300
boobby     : 1200
boobby     : None
(3500, [1000, 1300, 1200])

좋은 웹페이지 즐겨찾기