开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 迭代器

Python迭代器教程展示了如何在Python中使用迭代器。

迭代器

Iteration是循环遍历集合中的项目的过程。Iterable是一个可以迭代的对象。Iterator是一个允许遍历集合的所有元素的对象,无论其具体实现如何。它从关联的可迭代对象中生成连续的值。

在Python中,迭代器是实现迭代器协议的对象。迭代器协议由两种方法组成。__iter__方法必须返回迭代器对象,next方法返回序列中的下一个元素。iter内置函数用于从可迭代对象中获取迭代器。

如果迭代器的所有值都已返回,则next函数的后续调用会引发StopIteration异常。

迭代器有几个优点:

  • 更简洁的代码
  • 能够处理无限序列
  • 节省资源

Python有几个内置对象,它们实现了迭代器协议。例如列表、元组、字符串、字典或文件。

Python迭代器简单例子

以下简单示例使用字符串对象中的迭代器。

#!/usr/bin/python

text = "falcon"

it = iter(text)

print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))

在代码示例中,我们对字符串使用内置迭代器。在Python中,字符串是不可变的字符序列。

it = iter(text)

iter函数返回对象的迭代器。

print(next(it))

next函数返回可迭代对象的下一个元素。

$ ./simple_it.py
f
a
l
c
o
n

Python迭代器和for循环

for循环是在Python中使用迭代器的常用方法。for循环执行以下操作:

  • 调用iter获取迭代器
  • 重复调用next获取iterable的下一项
  • next引发StopIteration

时终止循环

for e in vals:
   print(e)

循环体对next返回的每个项目执行一次。变量e设置为每次迭代的给定项目。

#!/usr/bin/python

text = "an old falcon"

for val in text:
    print(val, end=" ")

print()

在示例中,我们使用for循环遍历文本。我们打印每个字符并在它们之间放置一个空格。

$ ./for_loop.py
a n   o l d   f a l c o n

列表、元组和集合内置函数

当我们在可迭代对象上使用listtupleset内置函数时,我们强制迭代器返回所有项.请注意,一些可迭代对象可能非常大。

#!/usr/bin/python

text = "an old falcon"

data = list(text)
print(data)

data2 = tuple(text)
print(data2)

data3 = set(text)
print(data3)

在示例中,我们使用listtupleset内置函数生成一个列表、一个元组和一组来自给定文本的字符。

$ ./list_tuple_set.py
['a', 'n', ' ', 'o', 'l', 'd', ' ', 'f', 'a', 'l', 'c', 'o', 'n']
('a', 'n', ' ', 'o', 'l', 'd', ' ', 'f', 'a', 'l', 'c', 'o', 'n')
{'f', 'd', 'n', 'o', 'a', ' ', 'c', 'l'}

Python迭代器读取行

当我们使用迭代器从文件中读取数据时,我们可以在不将整个文件读入内存的情况下获取下一行。这样我们就节省了系统资源。

blue
sky
cloud
winter
blow
water
falcon

这是words.txt文件。

#!/usr/bin/python

with open('words.txt', 'r') as f:

    for line in f:
        print(line.rstrip())

open函数返回一个文件对象,它是一个迭代器。我们可以在for循环中使用它。使用迭代器,代码更清晰。

$ ./read_data_iterator.py
blue
sky
cloud
winter
blow
water
falcon

Python自定义迭代器

要创建自定义迭代器,它必须实现迭代器协议:__iter____next__函数。

#!/usr/bin/python

class InfSeq:

   def __init__(self):
       
      self.x = 0

   def __next__(self):
   
      self.x += 1
      return self.x ** self.x

   def __iter__(self):
       
      return self


infseq = InfSeq()
n = 0

for e in infseq:

   print(e)
   n += 1
   
   if n > 10:
      break

在代码示例中,我们创建了一个数字序列1、4、27、256,…。这表明我们可以使用迭代器处理无限序列。

def __iter__(self):
    
    return self

for语句调用容器对象上的__iter__函数。该函数返回一个定义方法__next__的迭代器对象,该方法一次访问一个元素。

def next(self):

    self.x += 1
    return self.x ** self.x

next函数返回序列的下一个元素。

if n > 10:
    break

因为我们正在处理无限序列,所以我们必须在某个时刻中断for循环。

$ ./inf_seq.py 
1
4
27
256
3125
46656
823543
16777216
387420489
10000000000
285311670611

停止迭代

通过引发StopIteration异常终止迭代过程。

#!/usr/bin/python

import random

class RandomWord:

    def __init__(self):

        self.words = ['sky', 'blue', 'cloud', 'milk', 'cosmos',
            'rainbow', 'drop', 'new', 'stop']

    def __iter__(self):
        return self

    def __next__(self):

        random_word = random.choice(self.words)

        if random_word == 'stop':

            raise StopIteration  

        else:
            return random_word

rw = RandomWord()

for word in rw:
    print(word)

在代码示例中,我们有一个生成随机单词的自定义迭代器。我们在选择停用词时引发StopIteration异常。

$ ./random_words.py 
sky
blue
new
drop
milk
drop
milk
drop
blue

这是一个示例输出。

在本教程中,我们使用了Python中的迭代器。

列出所有Python教程。

未经允许不得转载:我爱分享网 » Python 迭代器

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏