Python의 생성기
3496 단어 pythonbeginnersprogramming
시작 노트
이 블로그를 읽기 전에 이 블로그는 전적으로 Python에서 생성기가 작동하는 방식에 대한 이해를 바탕으로 작성되었음을 분명히 밝히고 싶습니다. 앞으로 나아가려면 Python의 중급자여야 합니다.
반복자
셀 수 있는 값을 포함하는 개체입니다. 다음 값은 next(object_name)
매개변수로 액세스할 수 있습니다.
반복자에 대한 자세한 내용은 여기에서 확인할 수 있습니다. Iterators by W3 Schools
사례
당신이 회사에서 일하고 있고 회사에서 일련의 숫자를 찾는 프로그램을 작성하라는 작업을 준다고 가정해 보겠습니다. 각 숫자는 이전 숫자와 12의 차이가 있습니다. 따라서 시리즈는 다음과 같습니다. [12,24,36,48.....]
사용자가 지정한 숫자까지 시리즈를 찾고 다른 사람들이 루프를 사용하여 해당 값을 얻을 수 있도록 결과를 어딘가에 저장해야 합니다.
따라서 사용자가 10을 입력하면 프로그램은 12,24,36,........,120과 같은 계열을 반환합니다.
당신은 다음과 같을 것입니다: 알겠습니다. 쉽습니다.
def gen_series():
n = int(input("What's n? "))
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
print(gen_series())
이제 사용자가 12, 23, 89, 74와 같은 숫자를 입력하면 프로그램이 제대로 작동합니다.
이 코드를 직접 테스트하고 1000000000000000과 같은 숫자를 입력하면 어떻게 될까요?
코드가 멈추기 시작하고 프로그램이 원활하게 작동하지 않습니다. 따라서 이것은 일련의 숫자를 얻는 최선의 방법이 아닙니다.
이 코드를 약간 리팩토링해 봅시다
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
gen_series()
이제 프로그램은 동일하게 실행되지만 문제는 아직 해결되지 않았습니다. 우리는 각 숫자가 이전 숫자와 12의 차이가 있는 일련의 숫자를 생성하고 싶고 프로그램에서 원하는 만큼의 숫자를 생성하기를 원합니다.
다음 코드를 실행해 보세요.
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
gen_series()
이 코드를 실행하고 숫자를 20으로 입력하면 출력이 <generator object series at 0x0000020B20684350>
로 표시됩니다. 이제 다시 실행하고 1000000000000000과 같은 큰 숫자를 입력하면 프로그램이 지연되지 않는 것을 알 수 있습니다. 그것은 완벽하게 잘 작동하고 출력을 얻습니다.
yield
키워드는 이 함수를 생성기로 만드는 역할을 합니다.
series
함수는 이제 반복자를 생성하는 생성기 함수입니다. W3 Schools 기사를 읽었다면 루프를 사용하여 이터레이터에서 값에 쉽게 액세스할 수 있다는 것을 확실히 알 수 있습니다.
여기 제너레이터의 정의가 있습니다.
발전기
제너레이터는 반복자를 반환하는 함수입니다.
프로그램으로 돌아가기
이제 시리즈의 값을 인쇄하기 위해 다른 함수를 사용할 수 있습니다.
def print_series():
a = gen_series()
for i in a:
print(i)
전체 코드:
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
return a
def print_series():
a = gen_series()
for i in a:
print(i)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
print_series()
결론
셀 수 있는 값을 포함하는 개체입니다. 다음 값은
next(object_name)
매개변수로 액세스할 수 있습니다.반복자에 대한 자세한 내용은 여기에서 확인할 수 있습니다. Iterators by W3 Schools
사례
당신이 회사에서 일하고 있고 회사에서 일련의 숫자를 찾는 프로그램을 작성하라는 작업을 준다고 가정해 보겠습니다. 각 숫자는 이전 숫자와 12의 차이가 있습니다. 따라서 시리즈는 다음과 같습니다. [12,24,36,48.....]
사용자가 지정한 숫자까지 시리즈를 찾고 다른 사람들이 루프를 사용하여 해당 값을 얻을 수 있도록 결과를 어딘가에 저장해야 합니다.
따라서 사용자가 10을 입력하면 프로그램은 12,24,36,........,120과 같은 계열을 반환합니다.
당신은 다음과 같을 것입니다: 알겠습니다. 쉽습니다.
def gen_series():
n = int(input("What's n? "))
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
print(gen_series())
이제 사용자가 12, 23, 89, 74와 같은 숫자를 입력하면 프로그램이 제대로 작동합니다.
이 코드를 직접 테스트하고 1000000000000000과 같은 숫자를 입력하면 어떻게 될까요?
코드가 멈추기 시작하고 프로그램이 원활하게 작동하지 않습니다. 따라서 이것은 일련의 숫자를 얻는 최선의 방법이 아닙니다.
이 코드를 약간 리팩토링해 봅시다
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
gen_series()
이제 프로그램은 동일하게 실행되지만 문제는 아직 해결되지 않았습니다. 우리는 각 숫자가 이전 숫자와 12의 차이가 있는 일련의 숫자를 생성하고 싶고 프로그램에서 원하는 만큼의 숫자를 생성하기를 원합니다.
다음 코드를 실행해 보세요.
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
gen_series()
이 코드를 실행하고 숫자를 20으로 입력하면 출력이 <generator object series at 0x0000020B20684350>
로 표시됩니다. 이제 다시 실행하고 1000000000000000과 같은 큰 숫자를 입력하면 프로그램이 지연되지 않는 것을 알 수 있습니다. 그것은 완벽하게 잘 작동하고 출력을 얻습니다.
yield
키워드는 이 함수를 생성기로 만드는 역할을 합니다.
series
함수는 이제 반복자를 생성하는 생성기 함수입니다. W3 Schools 기사를 읽었다면 루프를 사용하여 이터레이터에서 값에 쉽게 액세스할 수 있다는 것을 확실히 알 수 있습니다.
여기 제너레이터의 정의가 있습니다.
발전기
제너레이터는 반복자를 반환하는 함수입니다.
프로그램으로 돌아가기
이제 시리즈의 값을 인쇄하기 위해 다른 함수를 사용할 수 있습니다.
def print_series():
a = gen_series()
for i in a:
print(i)
전체 코드:
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
return a
def print_series():
a = gen_series()
for i in a:
print(i)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
print_series()
결론
def gen_series():
n = int(input("What's n? "))
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
print(gen_series())
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
a = []
d = 11
for i in range(1, n+1):
a.append(i + d)
d += 11
return a
if __name__ == "__main__":
gen_series()
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
gen_series()
이제 시리즈의 값을 인쇄하기 위해 다른 함수를 사용할 수 있습니다.
def print_series():
a = gen_series()
for i in a:
print(i)
전체 코드:
def gen_series():
n = int(input("What's n? "))
a = series(n)
print(a)
return a
def print_series():
a = gen_series()
for i in a:
print(i)
def series(n):
d = 11
for i in range(1, n+1):
yield i + d
d += 11
if __name__ == "__main__":
print_series()
결론
yield
키워드이해하지 못했다면 댓글에서 저를 비판하는 것을 잊지 마세요. 더 나은 설명을 찾는 데 도움이 될 것입니다. 내가 당신의 시간을 낭비했다면 나를 비난해도 괜찮습니다. 또한 궁금하신 사항은 댓글로 문의주세요
Reference
이 문제에 관하여(Python의 생성기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/snehendu_roy_/generators-in-python-1lal텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)