>  기사  >  백엔드 개발  >  Python에서 반복자와 생성기를 사용하는 방법

Python에서 반복자와 생성기를 사용하는 방법

PHPz
PHPz앞으로
2023-05-22 12:13:21917검색

1. 반복자(foreach)

1. 반복 가능한 객체

__iter__ 메서드가 내장된 객체를 반복 가능한 객체라고 합니다. __iter__方法的都叫可迭代的对象。

Python内置str、list、tuple、dict、set、file都是可迭代对象。

x = 1.__iter__  # SyntaxError: invalid syntax

# 以下都是可迭代的对象
name = 'nick'.__iter__
print(type(name))  # 'method-wrapper'>

2、迭代器对象

执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。

只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的,只能使用迭代器对象。

  • 内置有__iter__方法,执行该方法会拿到迭代器本身。

  • 内置__next__

    Python의 내장 str, list, tuple, dict, set 및 file은 모두 반복 가능한 객체입니다.
  • s = 'hello'
    iter_s = s.__iter__()
    print(type(iter_s))  # 'str_iterator'> iter_s为迭代器对象
    
    while True:
        try:
            print(iter_s.__next__())
        except StopIteration:
            break
    #hello
2. Iterator 객체

iterable 객체의 __iter__ 메서드를 실행하면 반환값이 iterator 객체가 됩니다.

문자열과 목록만 인덱스 값에 의존하는 반면, 다른 반복 가능한 객체는 인덱스 값에 의존할 수 없으며 반복자 객체만 사용할 수 있습니다.

내장된 __iter__ 메소드가 있으며, 이 메소드를 실행하면 반복자 자체를 얻을 수 있습니다.

내장 __next__ 메서드, 이 메서드를 실행하면 반복자 개체의 값을 얻을 수 있습니다.
  • s = 'hello'
    iter_s = iter(s) # 创建迭代器对象
    print(type(iter_s))  #  iter_s为迭代器对象
    
    while True:
        try:
            print(next(iter_s)) # 输出迭代器的下一个元素
    
        except StopIteration:
            break
    # hello

    3. Iterator에는 iter()와 next()라는 두 가지 기본 메서드가 있습니다.
  • #str
    name = 'nick' 
    for x in name:
        print(x)
    
    #list
    for x in [None, 3, 4.5, "foo", lambda: "moo", object, object()]:
        print("{0}  ({1})".format(x, type(x)))
    
    #dict
    d = {
        '1': 'tasty',
        '2': 'the best',
        '3 sprouts': 'evil',
        '4': 'pretty good'
    }
    
    for sKey in d:
        print("{0} are {1}".format(sKey, d[sKey]))
    
    #file
    f = open('32.txt', 'r', encoding='utf-8')
    for x in f:
        print(x)
    f.close()
  • 4. for 반복자 루프

    Iterable 객체는 일반 for 문을 사용하여 직접 탐색할 수 있습니다.
  • for 루프를 반복자 루프라고 하며 in은 반복 가능 객체여야 합니다.

    class MyNumbers:
      def __iter__(self):
        self.a = 1
        return self
     
      def __next__(self):
        if self.a <= 20:
          x = self.a
          self.a += 1
          return x
        else:
          raise StopIteration
     
    myclass = MyNumbers()
    myiter = iter(myclass)
     
    for x in myiter:
      print(x)

    5. 반복자 구현(__next__ 및 __iter__)
클래스에서 __iter__() 및 __next__() 메서드를 구현한 후 이를 반복자로 사용할 수 있습니다.

__iter__() 메서드는 __next__() 메서드를 구현하는 특수 반복자 객체를 반환하고 StopIteration 예외를 통해 반복 완료를 알립니다.

__next__() 메서드는 다음 반복자 객체를 반환합니다.

StopIteration 예외는 무한 루프를 방지하기 위해 반복 완료를 표시하는 데 사용됩니다. __next__() 메서드에서는 반복을 종료하기 위해 지정된 수의 루프를 완료한 후 트리거되도록 StopIteration 예외를 설정할 수 있습니다.

숫자를 반환하는 반복자를 만듭니다. 초기 값은 1이고 점차적으로 1씩 증가하며 20회 반복 후 실행을 중지합니다.

class Range:
    def __init__(self, n, stop, step):
        self.n = n
        self.stop = stop
        self.step = step

    def __next__(self):
        if self.n >= self.stop:
            raise StopIteration
        x = self.n
        self.n += self.step
        return x

    def __iter__(self):
        return self


for i in Range(1, 7, 3):
    print(i)

#1
#4

1, 시뮬레이션된 범위

class Fib:
    def __init__(self):
        self._a = 0
        self._b = 1

    def __iter__(self):
        return self

    def __next__(self):
        self._a, self._b = self._b, self._a + self._b
        return self._a


f1 = Fib()
for i in f1:
    if i > 100:
        break
    print(&#39;%s &#39; % i, end=&#39;&#39;)

# 1 1 2 3 5 8 13 21 34 55 89
2, 피보나치 수열
import sys


def fibonacci(n):  # 函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  #f 是一个生成器
print(type(f))  # &#39;generator&#39;>

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

two , 생성기
  • 1, Yield

    파이썬에서는 Yield를 사용하는 함수를 제너레이터라고 합니다.
  • 제너레이터는 반복자를 반환하는 특수 함수이며 반복 작업에만 사용할 수 있습니다. 즉, 생성자는 반복자입니다.

    실행을 위해 생성기를 호출하는 과정에서 Yield를 만날 때마다 함수는 일시 중지하고 현재 실행 중인 모든 정보를 저장하고 Yield 값을 반환하며 다음 번 next() 메서드에서는 현재 위치에서 계속 실행됩니다. 실행됩니다.
생성기 함수를 호출하고 반복자 개체를 반환합니다.

    yield
  • 뒤에는 여러 값이 올 수 있지만(모든 유형 가능) 반환되는 값은 튜플 유형입니다.

  • 반복자를 사용자 정의하는 방법을 제공합니다

yield는 함수를 일시 중지하고 현재 반환 값을 제공할 수 있습니다.

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += 1


g = my_range(0, 3)
print(f"list(g): {list(g)}")

yield 및 반환:

동일: 둘 다 in입니다. 함수는 값을 반환할 수 있으며 반환 값의 유형이나 개수에는 제한이 없습니다

차이점: return은 한 번만 값을 반환할 수 있으며, Yield는 여러 값을 반환할 수 있습니다🎜🎜🎜🎜2. ) 방법 🎜
def range(*args, **kwargs):
    if not kwargs:
        if len(args) == 1:
            count = 0
            while count < args[0]:
                yield count
                count += 1
        if len(args) == 2:
            start, stop = args
            while start < stop:
                yield start
                start += 1
        if len(args) == 3:
            start, stop, step = args
            while start < stop:
                yield start
                start += step

    else:
        step = 1

        if len(args) == 1:
            start = args[0]
        if len(args) == 2:
            start, stop = args

        for k, v in kwargs.items():
            if k not in [&#39;start&#39;, &#39;step&#39;, &#39;stop&#39;]:
                raise (&#39;参数名错误&#39;)

            if k == &#39;start&#39;:
                start = v
            elif k == &#39;stop&#39;:
                stop = v
            elif k == &#39;step&#39;:
                step = v

        while start < stop:
            yield start
            start += step


for i in range(3):
    print(i)  # 0,1,2

for i in range(99, 101):
    print(i)  # 99,100

for i in range(1, 10, 3):
    print(i)  # 1,4,7

for i in range(1, step=2, stop=5):
    print(i)  # 1,3

for i in range(1, 10, step=2):
    print(i)  # 1,3,5,7,9
🎜복잡한 버전: 🎜
t = (i for i in range(10))
print(t)  # <generator object  at 0x00000000026907B0>
print(next(t))  # 0
print(next(t))  # 1
🎜3. 생성기 표현식(i.for .in)🎜🎜리스트 이해의 []를 ()로 바꾸면 생성기 표현식을 얻을 수 있습니다. 🎜🎜장점: 목록 이해와 비교하여 메모리를 절약할 수 있으며 한 번에 하나의 값만 메모리에 생성합니다.🎜
with open(&#39;32.txt&#39;, &#39;r&#39;, encoding=&#39;utf8&#39;) as f:
    nums = [len(line) for line in f]  # 列表推导式相当于直接给你一筐蛋

print(max(nums))  # 2


with open(&#39;32.txt&#39;, &#39;r&#39;, encoding=&#39;utf8&#39;) as f:
    nums = (len(line) for line in f)  # 生成器表达式相当于给你一只老母鸡。

print(max(nums))  # ValueError: I/O operation on closed file.
🎜예: 🎜rrreee

위 내용은 Python에서 반복자와 생성기를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제