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'>
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
s = 'hello' iter_s = iter(s) # 创建迭代器对象 print(type(iter_s)) # iter_s为迭代器对象 while True: try: print(next(iter_s)) # 输出迭代器的下一个元素 except StopIteration: break # hello
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()
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:
rreeeclass 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)
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
hasil
boleh diikuti dengan berbilang nilai (boleh daripada sebarang jenis), tetapi nilai yang dikembalikan adalah daripada jenis tupel.Menyediakan cara untuk menyesuaikan iterator
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('%s ' % i, end='') # 1 1 2 3 5 8 13 21 34 55 89
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)) # 'generator'> while True: try: print(next(f), end=" ") except StopIteration: sys.exit()
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)}")
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 ['start', 'step', 'stop']: raise ('参数名错误') if k == 'start': start = v elif k == 'stop': stop = v elif k == 'step': 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
Atas ialah kandungan terperinci Cara menggunakan iterator dan penjana dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!