python 생성기에서 주의해야 할 작은 문제

1701 단어 python생성기
Python에서 생성기와 함수는 매우 비슷하고 모두 운행하는 과정에서 각종 변수의 값을 확정하기 때문에 많은 상황에서 여러 가지 문제를 초래할 수 있다.

def generator_test1():
 # 0...9 generator
 x = (i for i in range(10))
 # 5..9 generator
 x_filter = filter(lambda y: y >= 5, x)
 # first use the x
 L = list(x)
 print("L, x", L)
 # then use x_filter
 l = list(x_filter)
 print("l, x_filter", l)
 
 
if __name__ == "__main__":
 generator_test1()
출력 결과:
L, x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l, x_filter []
위의 코드에서 x_filter는 생성기 x를 기반으로 구축된 생성기이지만 x가 x_에 있기 때문에filter 사용하기 전에 먼저 사용되었기 때문에 x_filter를 할 때 x의 값을 가져옵니다. 이때 x는 이미 다 썼습니다. 결국 x_filter가 변환된 목록은 비어 있습니다.

def generator_test2():
 x = (i for i in range(10))
 for i in range(10):
  x = (j + i for j in x)
 L = list(x)
 print("L, x", L)
 
if __name__ == "__main__":
 generator_test2()
출력 결과:
L, x [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 
상기 코드에서 매번 순환은 원래의 생성기를 바탕으로 새로운 생성기를 구축한다. 사용하지 않았기 때문에 생성기 x의 i는 값을 부여하지 않았다.뒤에 목록으로 바뀔 때 i의 값을 얻습니다. 이때 i가 9이기 때문에 모든 생성기 x의 i는 9이고 원시 x는 0에서 9의 생성기입니다. 다음 10개의 생성기는 각각 원시 값에 9를 더하여 모든 값이 90이 됩니다.다음은 이 예제의 변체입니다.

def generator_test3():
 x = (i for i in range(10))
 for i in range(10):
  x = (j + i for j in x)
 i = 20
 L = list(x)
 print("L, x", L)
 
if __name__ == "__main__":
 generator_test3()
출력 결과:
L, x [200, 201, 202, 203, 204, 205, 206, 207, 208, 209]
이상은python 생성기에서 주의해야 할 작은 문제에 대한 상세한 내용입니다. 더 많은python 생성기에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기