교체기와 생성기의 주의사항

12415 단어 수필.

교체기


교체 가능한 (교체 가능한 대상): 교체 가능한 대상은 모두 교체 가능한 것이다.예를 들어str,list,dict,tuple,파일 대상 등은 대상__iter__의 내부 방법만 있으면 교체 대상이라고 할 수 있다.
교체기: 교체기도 교체할 수 있다. 그는 __iter__ 방법뿐만 아니라 __next__ 방법도 있다.교체기는 한 번에 하나의 값만 얻을 수 있으며, 제거가 끝난 후에 오류가 발생하면 교체기를 얻을 수 있습니다. 교체 가능한 대상 __iter__() 을 호출하면 교체기를 사용할 수 있습니다.
  • 교체기를 호출하는 __next__() 방법
  • for순환
  • 사용
    교체기의 특징:
  • 타성 연산
  • 앞에서 뒤로 값을 추출하고 과정은 되돌릴 수 없고 중복할 수 없다
  • 메모리 절감
  •                     
       :
    print('__iter__' in dir([1,2,3,4]))
    print('__next__' in dir([1,2,3,4]))
       :
    from collections import Iterable
    from collections import Iterator
    print(isinstance([1,2,3,4],Iterable))
    str_iter = 'abc'.__iter__()
    print(isinstance(str_iter,Iterator))
    print(isinstance('abc',Iterable))

    생성기


    생성기의 본질은 바로 교체기이다. 교체기의 모든 특징을 가지고 있으며, 단지 생성기는 자신이 작성한python 코드일 뿐이다

    1. 생성기 함수


    생성기 함수와 일반 함수 사이의 차이점:
  • 생성기 함수에 yield 키워드 포함
  • 생성기 함수 호출 시 즉시 실행하지 않고 생성기
  • 로 되돌아오기
    def g_func():
        print('aaaa')
        yield 1
        print('bbbb')
        yield 2
        yield 3
    
    g = g_func()
    for i in g:
        print(i)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    
    def cloth():
        for i in range(1000000):
            yield  '  %s'%i
    
    g = cloth()
    for i in range(50):
        print(g.__next__())
    
    for i in range(50):
        print(g.__next__())
    

    2、sned 사용법(진급)

    def func():
        print('*'*10)
        a = yield 5
        print('a : ',a)
        yield 10
    g = func()
    num = g.__next__()
    # print(num)
    num2 = g.send('alex')
    num2 = g.send('aaaa')
    print(num2)
    

    ** 다음 예에서 send는 "yield average"에서 average를 반환하고 10을 "yield average"에 전달합니다.**
    def averager():
        total = 0.0
        count = 0
        average = None
        while True:
            term = yield average
            total += term
            count += 1
            average = total/count
    g_avg = averager()
    g_avg.__next__() ---》         ,     None
    print(g_avg.send(10)) ---》      10,    term =10yield average  ,  average,             average = total/count     
    print(g_avg.send(30)) ---》  term =      ,         average  ,    
    print(g_avg.send(20))
    print(g_avg.send(100))
    print(g_avg.send(200))

    생성기의 예비 장식기는send를 사용할 때 먼저next 방법을 한 번 사용해야 하며 구체적인 요소는 위의 예를 참조한다
    def init(func):  #         
        def inner(*args,**kwargs):
            g = func(*args,**kwargs)   #func = averager
            g.__next__()
            return g
        return inner
    
    @init
    def averager():
        total = 0.0
        count = 0
        average = None
        term = yield average
        total += term
        count += 1
        average = total/count
        yield average
    g_avg = averager()
    print(g_avg.send(10))
    print(g_avg.send(30))

    3. 총결산

  • 생성기 함수: 생성기 생성 함수
  • 생성기의 본질 매개 변수 교체기
  • 생성기 함수의 특징:
  • yield 키워드 포함
  • 호출 후 함수 내의 코드가 실행되지 않음
  • 실행을 트리거하는 방법:
  • next
  • send: send(None) == __next__(),send는next의 기초에서 생성기 함수 내부에 값을 업로드한다(send 작업은 생성기에서 사용하는 첫 번째 작업에 사용할 수 없다)
  • for순환

  • 3. 생성기 표현식


    1. 도입부


    (1) 목록 유도식


    예1:30 이내에 3으로 나눌 수 있는 모든 수
    >>> [i for i in range(30) if i%3 == 0]
    [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

    예2:30 이내에 3으로 나눌 수 있는 모든 수의 제곱
    >>> [i**2 for i in range(30) if i%3 == 0]
    [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

    예3: 플러그인 목록에 두 개의'e'가 포함된 모든 이름을 찾습니다.
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    >>> [j for i in names for j in i if j.count('e') == 2]
    ['Jefferson', 'Wesley', 'Steven', 'Jennifer']

    (2) 사전 유도식


    예1: 사전의 키와value를 대조합니다
    >>> dic = {'a': 10, 'b': 34}
    >>> {dic[k]:k for k in dic}
    {10: 'a', 34: 'b'}
    >>> 

    예2: 대소문자에 대응하는value값을 합쳐서 k를 소문자로 통일합니다
    
    >>> dic= {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    >>> {k.lower():dic.get(k.lower(),0) + dic.get(k.upper(),0)for k in dic}
    {'a': 17, 'b': 34, 'z': 3}

    (3) 집합 유도식


    예: 목록의 각 값의 제곱을 계산하고 무게 제거 기능을 가져옵니다
    >>> {i**2 for i in [1,-1,2]}
    {1, 4}

    2. 생성기 표현식

    g = (i*i for i in y)
    for i in g:
        print(i)
    

    좋은 웹페이지 즐겨찾기