교체기iter_생성기

6376 단어 python 구문

교체기


정의:


list,string,tuple,dict 등 용기 대상에 대해 for 순환을 사용하는 것이 편리합니다.백엔드 for 문장에서 용기 대상에 iter () 함수를 호출합니다.iter ()는python 내장 함수입니다.iter () 함수는next () 방법을 정의한 교체기 대상을 되돌려줍니다. 이것은 용기에서 용기 안의 요소를 하나하나 접근합니다.next ()도python 내장 함수입니다.다음 요소가 없을 때,next () 는 StopIteration 이상을 던져서 for 문장의 순환이 끝났다는 것을 알립니다.
교체기는 매번 교체가 접근하는 위치를 기록하는 데 도움을 줍니다. 교체기에next () 함수를 사용할 때, 교체기는 기록된 위치의 다음 위치를 우리에게 되돌려줍니다.실제로next() 함수를 사용할 때 호출되는 것은 교체기 대상의next_방법(Python3에서는 대상의 next 방법, Python2에서는 대상의next() 방법).그래서 우리가 교체기를 구축하려면 그것을 실현해야 한다next_방법
그러나 이것은 부족하다. python은 교체기 자체도 교체할 수 있도록 요구하기 때문에 우리는 교체기를 위해 실현해야 한다iter_메서드iter_방법은 하나의 교체기를 되돌려야 한다. 교체기 자체가 바로 교체기이기 때문에 교체기의iter_방법은 자신에게self를 되돌려주면 된다.

몇 가지 용어에 대한 설명:


1, 교체기 프로토콜: 대상은next () 방법을 제공해야 합니다. 교체의 다음 항목을 되돌려주거나 StopIteration 이상을 일으켜 교체를 종료합니다.
2, 교체 가능 대상: 교체기 프로토콜 대상을 실현했다.list,tuple,dict는 모두 Iterable (교체 가능 대상) 이지만 Iterator (교체기 대상) 는 아닙니다.그러나 내장 함수 iter () 를 사용하여 이것들을 모두 Iterable (교체기 대상) 으로 만들 수 있습니다.
3, for item in Iterable 순환의 본질은 iter () 함수를 통해 교체 가능한 대상인 Iterable의 교체기를 얻은 다음에 얻은 교체기가next () 방법을 계속 호출하여 다음 값을 가져오고 item에 부여하는 것이다. StopIteration의 이상이 발생하면 순환이 끝난다

Python 자체 컨테이너 객체 사례:

#  list
listArray=[1,2,3]
#  iter() 
iterName=iter(listArray)
print(iterName)
#  : list 
# 

print(next(iterName))
print(next(iterName))
print(next(iterName))
print(next(iterName))# , 
# 1
# 2
# 3
# Traceback (most recent call last):
#   File "Test07.py", line 32, in 
# StopIteration!

파이썬 중 하나가 이루어졌습니다iter_메서드 및next_방법의 유형 대상은 바로 교체기이다. 다음과 같은 사례는 피보나 절수열을 계산하는 사례이다

class Fib(object):
    def __init__(self, max):
        super(Fib, self).__init__()
        self.max = max
    def __iter__(self):
        self.a = 0
        self.b = 1
        return self
    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib
#  main , 
def main():
    # 100 
    fib = Fib(100)
    for i in fib:
        print(i)
#  
if __name__ == '__main__':
    main()

설명:
이 유형의 실현에서 하나의 를 정의하였다iter_(self) 방법, 이 방법은 for가 순환할 때iter () 에 호출되어 교체기를 되돌려줍니다.옮겨다닐 때,python 내장 함수 iter () 를 직접 호출하고,iter () 가 호출하기 때문에iter_(self) 대상을 얻는 교체기.교체기가 있으면 원소를 하나하나 훑어볼 수 있다.하나하나 훑어볼 때도 내장된next() 함수를 사용하여 호출 대상의next_(self) 방법은 교체기의 대상을 두루 훑어본다.그래서 이루어져야 돼요.iter_(self) 및next_(self) 이 두 가지 방법.
그리고 이루어졌기 때문에...next_(self) 방법으로 이루어지고 있습니다iter_(self)일 때, 바로self로 돌아가면 됩니다.
한마디로 사용자 정의 용기 대상을 반복할 때python 내장 함수iter () 를 사용하여 반복 대상을 호출합니다iter_(self) 교체기를 획득한 후 이 교체기에 대해next()를 사용하여 교체기 대상을 호출하는next_(self).
참고:iter_(self)는 한 번만 호출되고next_(self)는 StopIteration 예외가 발생할 때까지 n번 호출됩니다.
class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 #  a,b
    def __iter__(self):
        return self #  , 
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b #  
        if self.a > 100000: #  
            raise StopIteration();
        return self.a #  

IJCNLP의 예:


주의: 이 예에는 이 없습니다.next(self)__,아이엘드를 사용했어요.
이렇게 생성된 것은 생성기이다.그래서 다음에 언급한 생성기의 용법과 더욱 비슷하다.
iter(a)가 실제로 생성된 for line in self.num_list:yield line 이 부분 코드는 함수에 해당합니다
class FlashcardSentences(object):
    def __init__(self, num_list):
        self.num_list = num_list
    def __iter__(self):
        for line in self.num_list:
            yield line
            
a=FlashcardSentences([3,2,3,4,5])
''' : '''
print(iter(a))
#
for i in a:
    print(i)
//
class FlashcardSentences(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for line in open(self.filename, "rb"):
            line = line.strip()
            line = line.decode("utf8").encode("ascii", "ignore")
            _, question, answer = line.split("\t")
            qwords = nltk.word_tokenize(question)
            awords = nltk.word_tokenize(answer)
            yield qwords + awords

 

생성기


역할:


교체기는 하나의 대상이고 생성기는 하나의 함수이다. 교체기와 생성기는python의 두 가지 매우 강력한 특성이다. 프로그램을 작성할 때 생성기를 사용하지 않아도 같은 효과를 얻을 수 있지만 생성기는 당신의 프로그램을pythonic로 더욱 발전시킨다.
생성기는 함수에 yield 문장을 추가하기만 하면 됩니다.함수에서 yield를 사용할 때마다 값이 생성되면 함수는 이 값을 되돌려주고 실행을 멈추고 활성화되기를 기다리며 활성화된 후에 원래의 위치에서 계속 실행합니다.
즉, yield가 실행될 때마다 잠시 멈춘다.
다음 예에서는 동일한 기능을 제공합니다.

참고 사항:


생성기는 한 번만 훑어볼 수 있습니다.
생성기는 특수한 교체기이다.

예:

#!/usr/bin/env python
#coding=utf-8
def fib():
    a,b = 0,1
    while 1:
        a,b = b,a+b
        yield a
for f in fib():
    if f < 10000:
        print f
    else:
        break

다음 예에 유의하십시오.
f=Fib(10)는 iter () 함수를 사용할 필요가 없는 생성기를 생성합니다. 
def Fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return ' ! ...'
#  , 10 
f=Fib(10)
#  return  , StopIteration value 
while  True:
    try:
        x=next(f)
        print("f:",x)
    except StopIteration as e:
        print(" :",e.value)
        break
def createGenerator():
    mylist = range(3)
    for i in mylist:
        yield i*i

mygenerator = createGenerator() #  
print(mygenerator) # mygenerator is an object!
#
for i in mygenerator:
    print(i)

CNN 감정 분석의 예:

def batch_iter(data, batch_size, num_epochs):
    """
    Generates a batch iterator for a dataset.
    """
    data = np.array(data)
    data_size = len(data)
    num_batches_per_epoch = int(len(data)/batch_size) + 1
    for epoch in range(num_epochs):
        # Shuffle the data at each epoch
        shuffle_indices = np.random.permutation(np.arange(data_size))
        shuffled_data = data[shuffle_indices]
        for batch_num in range(num_batches_per_epoch): #batch_num 
            start_index = batch_num * batch_size
            end_index = min((batch_num + 1) * batch_size, data_size)
            yield shuffled_data[start_index:end_index]

좋은 웹페이지 즐겨찾기