搜尋
首頁後端開發Python教學Python中迭代器與生成器怎麼使用

一、迭代器(foreach)

1、可迭代的物件

內建有__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__方法,執行方法會拿到迭代器物件中的一個值。

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、迭代器有兩個基本的方法: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

4、for迭代器循環

可迭代物件可以直接使用常規for語句進行遍歷

for循環稱為迭代器循環,in後面必須是可迭代的對象。

#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、實作迭代器(__next__和__iter__)

在類別中實作__iter__() 和__next__() 兩個方法後,即可使其作為迭代器來使用。

  • __iter__() 方法傳回一個特殊的迭代器對象, 這個迭代器物件實現了 __next__() 方法並透過 StopIteration 異常標識迭代的完成。

  • __next__() 方法會傳回下一個迭代器物件。

  • StopIteration 異常用於標識迭代的完成,防止無限循環的情況,在__next__() 方法中我們可以設定在完成指定循環次數後觸發StopIteration 異常來結束迭代。

建立一個回傳數字的迭代器,初始值為1,逐步遞增1,在20 次迭代後停止執行:

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)

1、類比range

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、斐波那契數列

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

二、生成器

1、yield

在Python 中,使用了yield 的函數稱為生成器(generator)。

生成器是一種特殊的函數,它會傳回一個迭代器,僅可用於迭代操作。換言之,生成器就是一種迭代器。

在呼叫生成器運行的過程中,每次遇到yield 時函數會暫停並保存當前所有的運行信息,返回yield 的值, 並在下一次執行next() 方法時從當前位置繼續運行。

呼叫一個生成器函數,傳回的是一個迭代器物件。

yield後面可以加多個數值(可以是任意型別),但傳回的值是元組類型的。

  • 提供自訂迭代器的方式

  • yield可以暫停函數,並提供目前的回傳值

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

yield和return:

  • 相同點:兩者都是在函數內部使用,都可以傳回值,且傳回值沒有型別和數位的限制

  • 不同點:return只能傳回一次值;yield可以傳回多次值

2、自訂range()方法

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 [&#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

3、生成器表達式(i.for .in)

把列表推導式的[]換成()就是生成器表達式式。

優點:比起列表推導式,可以省內存,一次只產生一個值在內存中

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

舉例:

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.

以上是Python中迭代器與生成器怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具