python
반복자는 반복할 수 있는 개체입니다. 이 튜토리얼에서는 반복자의 작동 방식과 __iter__ 및 __next__ 메서드를 사용하여 고유한 반복자를 구축하는 방법을 배웁니다.
반복자는 Python의 모든 곳에 있습니다. for
내에서 우아하게 구현됩니다. 루프, 컴프리헨션, 제너레이터 등이지만 잘 보이지 않는 곳에 숨겨져 있습니다.
Python의 Iterator는 단순히 반복할 수 있는 객체입니다. 한 번에 한 요소씩 데이터를 반환하는 개체입니다.
기술적으로 말하자면 Python 반복자 객체 두 가지 특수 메서드인 __iter__()
을 구현해야 합니다. 및 __next__()
, 집합적으로 반복자 프로토콜이라고 함 .
개체를 반복 가능이라고 합니다. iterator를 얻을 수 있다면. 목록, 튜플, 문자열 등과 같은 Python의 내장 컨테이너 대부분은 반복 가능합니다.
iter()
함수(이는 차례로 __iter__()
메서드)에서 반복자를 반환합니다.
next()
을 사용합니다. iterator의 모든 항목을 수동으로 반복하는 함수입니다. 끝에 도달하고 더 이상 반환할 데이터가 없으면 StopIteration
이 발생합니다. 예외. 다음은 예시입니다.
# define a list
my_list = [4, 7, 0, 3]
# get an iterator using iter()
my_iter = iter(my_list)
# iterate through it using next()
# Output: 4
print(next(my_iter))
# Output: 7
print(next(my_iter))
# next(obj) is same as obj.__next__()
# Output: 0
print(my_iter.__next__())
# Output: 3
print(my_iter.__next__())
# This will raise error, no items left
next(my_iter)
출력
4 7 0 3 Traceback (most recent call last): File "<string>", line 24, in <module> next(my_iter) StopIteration
자동으로 반복하는 보다 우아한 방법은 for 루프를 사용하는 것입니다. 이것을 사용하여 반복자를 반환할 수 있는 모든 개체(예:목록, 문자열, 파일 등)를 반복할 수 있습니다.
>>> for element in my_list:
... print(element)
...
4
7
0
3
<시간>
위의 예에서 볼 수 있듯이 for
루프가 목록을 자동으로 반복할 수 있었습니다.
사실 for
루프는 모든 이터러블을 반복할 수 있습니다. for
루프는 실제로 Python에서 구현됩니다.
for element in iterable:
# do something with element
실제로 다음과 같이 구현됩니다.
# create an iterator object from that iterable
iter_obj = iter(iterable)
# infinite loop
while True:
try:
# get the next item
element = next(iter_obj)
# do something with element
except StopIteration:
# if StopIteration is raised, break from loop
break
따라서 내부적으로 for
루프는 반복자 객체, iter_obj
를 생성합니다. iter()
을 호출하여 반복 가능합니다.
아이러니하게도 이 for
루프는 실제로 무한 루프입니다.
루프 내에서 next()
를 호출합니다. 다음 요소를 가져오고 for
의 본문을 실행합니다. 이 값으로 루프. 모든 항목이 소진되면 StopIteration
내부에서 포착되고 루프가 종료됩니다. 다른 종류의 예외는 통과됩니다.
파이썬에서 반복자를 처음부터 만드는 것은 쉽습니다. __iter__()
만 구현하면 됩니다. 및 __next__()
방법.
__iter__()
메서드는 반복자 개체 자체를 반환합니다. 필요한 경우 일부 초기화를 수행할 수 있습니다.
__next__()
메서드는 시퀀스의 다음 항목을 반환해야 합니다. 끝에 도달하고 후속 호출에서 StopIteration
을 발생시켜야 합니다. .
여기에서는 각 반복에서 2의 다음 거듭제곱을 제공하는 예를 보여줍니다. 거듭제곱 지수는 0에서 시작하여 사용자가 설정한 숫자까지입니다.
객체 지향 프로그래밍에 대해 잘 모르는 경우 Python 객체 지향 프로그래밍을 방문하세요.
class PowTwo:
"""Class to implement an iterator
of powers of two"""
def __init__(self, max=0):
self.max = max
def __iter__(self):
self.n = 0
return self
def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration
# create an object
numbers = PowTwo(3)
# create an iterable from the object
i = iter(numbers)
# Using next to get to the next iterator element
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))
출력
1 2 4 8 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 32, in <module> print(next(i)) File "<string>", line 18, in __next__ raise StopIteration StopIteration
for
도 사용할 수 있습니다. 반복자 클래스를 반복하는 루프.
>>> for i in PowTwo(5):
... print(i)
...
1
2
4
8
16
32
<시간> 반복자 객체의 항목이 소진되어야 할 필요는 없습니다. 무한 반복자가 있을 수 있습니다(끝나지 않음). 이러한 반복자를 다룰 때는 주의해야 합니다.
다음은 무한 반복자를 보여주는 간단한 예입니다.
내장 함수 iter()
첫 번째 인수는 호출 가능한 객체(함수)여야 하고 두 번째 인수는 센티넬이어야 하는 두 개의 인수로 호출될 수 있습니다. 반복자는 반환된 값이 센티넬과 같아질 때까지 이 함수를 호출합니다.
>>> int()
0
>>> inf = iter(int,1)
>>> next(inf)
0
>>> next(inf)
0
int()
함수는 항상 0을 반환합니다. 따라서 iter(int,1)
로 전달합니다. int()
를 호출하는 반복자를 반환합니다. 반환된 값이 1이 될 때까지. 이것은 절대 발생하지 않으며 무한 반복자를 얻습니다.
우리는 또한 우리 자신의 무한 반복자를 만들 수 있습니다. 다음 반복자는 이론적으로 모든 홀수를 반환합니다.
class InfIter:
"""Infinite iterator to return all
odd numbers"""
def __iter__(self):
self.num = 1
return self
def __next__(self):
num = self.num
self.num += 2
return num
샘플 실행은 다음과 같습니다.
>>> a = iter(InfIter())
>>> next(a)
1
>>> next(a)
3
>>> next(a)
5
>>> next(a)
7
등등...
이러한 유형의 무한 반복자를 반복할 때 종료 조건을 포함하도록 주의하십시오.
반복자를 사용하는 이점은 리소스를 절약한다는 것입니다. 위와 같이 전체 숫자 체계를 메모리에 저장하지 않고도 모든 홀수를 얻을 수 있습니다. 유한한 메모리에 (이론적으로) 무한한 항목을 가질 수 있습니다.
Python에서 반복자를 만드는 더 쉬운 방법이 있습니다. 자세한 내용은 yield를 사용하는 Python 생성기를 참조하세요.
python
파이썬 strptime() 이 기사에서는 문자열에서 datetime 객체를 만드는 방법을 배웁니다(예제를 통해). 동영상:Python의 날짜 및 시간 strptime() 메소드는 주어진 문자열에서 datetime 객체를 생성합니다. 참고: datetime을(를) 만들 수 없습니다. 모든 문자열의 개체. 문자열은 특정 형식이어야 합니다. 예시 1:문자열을 datetime 개체로 from datetime import datetime date_string = 21 June, 2018 print(date_string =,
놓치신 경우:Python 2는 2020년 1월 1일부로 공식적으로 지원되지 않음 . 아직 Python 2.7을 사용 중이라면 지금 업그레이드하세요. . 실행 중인 버전이 확실하지 않은 경우 Python 버전을 확인하세요. 많은 패키지 유지 관리자가 Python 3으로 마이그레이션했습니다. 일부는 여전히 Python 2를 지원하고 다른 일부는 이미 Python 2 지원을 중단했습니다. Python 2 코드 기반에서 마이그레이션해야 하는 경우 Python 코드를 Python 3으로 마이그레이션하는 방법에 대한 가이드를 읽어보세요.