Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan iterator dan penjana dalam Python

Cara menggunakan iterator dan penjana dalam Python

PHPz
PHPzke hadapan
2023-05-22 12:13:21910semak imbas

1. Iterator (foreach)

1. Objek boleh lelar

Objek yang mempunyai kaedah __iter__ terbina dalam dipanggil objek boleh lelar.

Str, senarai, tuple, dict, set dan fail terbina dalam Python adalah semua objek boleh lelaran.

x = 1.__iter__  # SyntaxError: invalid syntax

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

2. Objek Iterator

melaksanakan kaedah __iter__ objek boleh lelar, dan nilai pulangan yang diperoleh ialah objek lelaran.

Hanya rentetan dan senarai bergantung pada nilai indeks, manakala objek lelaran lain tidak boleh bergantung pada nilai indeks dan hanya boleh menggunakan objek lelaran.

  • mempunyai kaedah __iter__ terbina dalam, dan melaksanakan kaedah ini akan mendapatkan iterator itu sendiri.

  • Kaedah __next__ terbina dalam, melaksanakan kaedah ini akan mendapat nilai dalam objek iterator.

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

3. Iterator mempunyai dua kaedah asas: iter() dan next().

s = 'hello'
iter_s = iter(s) # 创建迭代器对象
print(type(iter_s))  #  iter_s为迭代器对象

while True:
    try:
        print(next(iter_s)) # 输出迭代器的下一个元素

    except StopIteration:
        break
# hello

4. untuk gelung lelaran

Objek boleh lelar boleh dilalui terus menggunakan penyataan biasa

Gelung for dipanggil gelung lelaran, dan ia mesti boleh diulang selepas dalam objek.

#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()

5. Laksanakan iterator (__next__ dan __iter__)

Selepas melaksanakan kaedah __iter__() dan __next__() dalam kelas, anda boleh menggunakannya sebagai iterator untuk digunakan.

  • Kaedah __iter__() mengembalikan objek iterator khas yang melaksanakan kaedah __next__() dan menandakan selesainya lelaran melalui pengecualian StopIteration. Kaedah

  • __next__() mengembalikan objek lelaran seterusnya.

  • Pengecualian StopIteration digunakan untuk menandakan selesainya lelaran untuk mengelakkan gelung tak terhingga Dalam kaedah __next__(), kita boleh menetapkan pengecualian StopIteration untuk dicetuskan selepas melengkapkan bilangan gelung yang ditentukan. untuk menamatkan lelaran.

Buat iterator yang mengembalikan nombor Nilai awal ialah 1, secara beransur-ansur meningkat sebanyak 1 dan menghentikan pelaksanaan selepas 20 lelaran:

rreee

1, julat simulasi<.>
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)

2. Jujukan Fibonacci

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

2. Penjana

1.

Penjana ialah fungsi khas yang mengembalikan lelaran dan hanya boleh digunakan untuk operasi lelaran. Dalam erti kata lain, penjana adalah lelaran.

Semasa proses memanggil penjana, setiap kali ia menemui hasil, fungsi akan menjeda dan menyimpan semua maklumat semasa yang sedang berjalan, mengembalikan nilai hasil, dan meneruskan dari kedudukan semasa pada kali seterusnya () kaedah dijalankan.

Panggil fungsi penjana dan kembalikan objek lelaran.

hasil

boleh diikuti dengan berbilang nilai (boleh daripada sebarang jenis), tetapi nilai yang dikembalikan adalah daripada jenis tupel.

Menyediakan cara untuk menyesuaikan iterator
  • hasil boleh menjeda fungsi dan memberikan nilai pulangan semasa
  • 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

    hasil dan pulangan:

Perkara yang sama: kedua-duanya digunakan di dalam fungsi, kedua-duanya boleh mengembalikan nilai dan nilai pulangan tidak mempunyai Sekatan jenis atau nombor
  • Perbezaan: pulangan hanya boleh mengembalikan nilai sekali; hasil boleh mengembalikan berbilang nilai
  • Kaedah julat() tersuai
  • 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()
Versi kompleks:

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)}")

3. Ungkapan penjana (i.for .in)

Ganti [] dalam pemahaman senarai dengan () untuk mendapatkan Mod ekspresi penjana.

Kelebihan: Berbanding dengan pemahaman senarai, ia boleh menjimatkan memori dan hanya menjana satu nilai dalam ingatan pada satu masa

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

Contoh:

t = (i for i in range(10))
print(t)  # <generator object  at 0x00000000026907B0>
print(next(t))  # 0
print(next(t))  # 1

Atas ialah kandungan terperinci Cara menggunakan iterator dan penjana dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam