반복자와 생성자의 종합적인 예
반복자와 제너레이터는 기본적으로 상호 운용이 가능하기 때문에 일부 지식 포인트를 함께 통합해야 합니다
1. 역방향 반복
역방향 반복도 처음부터 반복하는 예와 같이 공통 요구 사항이 있습니다. 출력 목록 요소,
list1 = [1,2,3,4,5] for num1 in list1 : print ( num1 , end = ' ' )
1에서 5까지. 그러면 5에서 1까지 무엇을 해야 할까요? 이것도 매우 간단합니다. Python
list1 = [1,2,3,4,5] for num1 in reversed(list1) : print ( num1 , end = ' ' )
내장 함수 reversed()가 있습니다. 방향 반복은 매우 간단하지만, 한 가지 주의할 점은 역 반복은 객체의 크기가 미리 결정될 수 있거나 객체가 있을 때만 발생한다는 것입니다. __reversed__()의 특수 메서드를 구현하여 적용합니다. 둘 다 충족되지 않으면 먼저 객체를 목록으로 변환해야 합니다. 실제로 사용자 정의 클래스에 __reversed__() 메서드를 구현하여 역방향 반복을 구현할 수 있는 경우가 많습니다. 그러나 이전 장에서는 일부 지식 사항이 언급되지 않았지만 프로그래밍 기초가 있는 사람들은 위의 지식 사항을 학습한 후 이해할 수 있을 것입니다.
# -*- coding: UTF-8 -*- class Countdown: def __init__(self, start): self.start = start def __iter__(self): # Forward iterator n = self.start while n > 0: yield n n -= 1 def __reversed__(self): # Reverse iterator n = 1 while n <= self.start: yield n n += 1 for rr in reversed(Countdown(30)): print(rr) for rr in Countdown(30): print(rr)
출력 결과는 1~30, 30~1로 각각 순차 인쇄와 역방향 인쇄입니다
2 동시에 여러 시퀀스를 반복합니다여러 시퀀스를 동시에 반복하고 싶습니다. 매번 하나의 시퀀스에서 요소를 가져옵니다. 그런 필요성을 느낀 적이 있습니까?
여러 시퀀스를 동시에 반복하려면 zip() 함수를 사용하세요. 구체적인 예:
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '两点水'] ages = [18, 19, 20] for name, age in zip(names, ages): print(name,age)
출력 결과:
laingdianshui 18 twowater 19 两点水 20
실제로 zip(a, b)는 튜플( x, y) , 여기서 x는 a에서 나오고 y는 b에서 나옵니다. 시퀀스 중 하나가 끝에 도달하면 반복이 종료됩니다. 따라서 반복 길이는 매개변수에서 가장 짧은 시퀀스의 길이와 일치합니다. 이 문장을 이해하는데 주의하세요. 즉, a와 b의 길이가 일치하지 않으면 가장 짧은 것을 기준으로 삼아 순회가 종료됩니다.
zip() 함수를 사용하면 다음과 같이 키 목록과 값 목록에서 dict(사전)를 생성할 수도 있습니다.
# -*- coding: UTF-8 -*- names = ['laingdianshui', 'twowater', '两点水'] ages = [18, 19, 20] dict1= dict(zip(names,ages)) print(dict1)
다음 결과를 출력합니다.
{'laingdianshui': 18, 'twowater': 19, '两点水': 20}
여기서 zip()이 할 수 있는 것을 언급하겠습니다. 두 개가 아닌 두 개 이상의 시퀀스 매개변수를 허용합니다.