산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

파이썬 반복자

파이썬 반복자

반복자는 반복할 수 있는 개체입니다. 이 튜토리얼에서는 반복자의 작동 방식과 __iter__ 및 __next__ 메서드를 사용하여 고유한 반복자를 구축하는 방법을 배웁니다.

동영상:Python 반복자

Python의 반복자

반복자는 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 루프는 모든 이터러블을 반복할 수 있습니다. 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
<시간>

Python 무한 반복자

반복자 객체의 항목이 소진되어야 할 필요는 없습니다. 무한 반복자가 있을 수 있습니다(끝나지 않음). 이러한 반복자를 다룰 때는 주의해야 합니다.

다음은 무한 반복자를 보여주는 간단한 예입니다.

내장 함수 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

  1. 파이썬 데이터 유형
  2. 파이썬 연산자
  3. 파이썬 통과 문
  4. 파이썬 함수 인수
  5. 파이썬 사전
  6. 파이썬 클로저
  7. 파이썬 날짜 시간
  8. 파이썬 수면()
  9. 파이썬 - 개요
  10. 파이썬 - 숫자