目錄
如何實作可迭代物件和迭代器物件
生成器簡介
如何使用生成器函數實作可迭代物件
如何進行反向迭代以及如何實現反向迭代
如何對迭代器做切片操作
如何在一個for語句中迭代多個可迭代物件
首頁 後端開發 Python教學 寫給Python程式設計高手2:迭代器

寫給Python程式設計高手2:迭代器

Nov 04, 2020 pm 05:19 PM
Python直式程式設計 迭代器

python教學專欄介紹程式設計用到的迭代器。

寫給Python程式設計高手2:迭代器

相關免費學習推薦:python教學(影片)

如何實作可迭代物件和迭代器物件

迭代器模式是一種經典的軟體設計模式,現在許多程式語言都內建了這種設計模式。在Python的原始資料類型中,可以進行for迴圈的都屬於可迭代的類型。當然,也可以使用iter函數取得到對應的迭代器,然後遍歷該物件。如下面的程式碼:

l = [1, 3]  # 可迭代对象 __iter__t = iter(l) #获取迭代器对象print(t.__next__())
print(t.__next__())# print(t.__next__()) # 报异常复制代码
登入後複製

要實作一個可迭代對象,一般先要實作對應的迭代器對象。在Python實作迭代器,其實只需要實作__next__方法。但collections套件中的Iterator類別將__next__方法定義為了抽象方法,筆者認為鑑於程式的可讀性,在實作迭代器時不妨繼承Iterator類別。

from random import samplefrom collections import Iterable, Iteratorclass WeatherIterator(Iterator):
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def getWeather(self, city):
        return (city, sample(['sun','wind','yu'], 1)[0])    def __next__(self):
        if self.index == len(self.cities):            raise StopIteration
        city = self.cities[self.index]
        self.index += 1
        return self.getWeather(city)复制代码
登入後複製

實作可迭代的對象,也只要實作__iter__方法即可,同樣的,collections套件中的Iterable類別也將__iter__方法定義為抽象類別。

from collections import Iterableclass WeatherIterable(Iterable):
    def __init__(self, cities):
        self.cities = cities
        self.index = 0

    def __iter__(self):
        return WeatherIterator(self.cities)复制代码
登入後複製

這樣就可以使用for迴圈來迭代了。

for weather in WeatherIterable(['北京', '上海', '广州']):
    print(weather)复制代码
登入後複製

生成器簡介

先看如下程式碼:

def gen():
    print("step 1")    yield 1
    print("step 2")    yield 2
    print("step 3")    yield 3复制代码
登入後複製

上面的gen函數的回傳值就是一個生成器物件。

g = gen()
g.__next__()
print(g.__next__())
print(g.__next__())复制代码
登入後複製

如上述程式碼,每呼叫一次生成器的__next__方法,它都會執行一段gen函數,遇到yield關鍵字為止,並傳回其後的東西。因此,生成器可以理解為一種能夠被打斷的函數。

注意:生成器物件也是可迭代的物件。

for x in g:
    print(x)复制代码
登入後複製

如何使用生成器函數實作可迭代物件

將__iter__方法實作為生成器函數,就可以實作可迭代物件。

class PrimeNumbers:
    def __init__(self, start, end):
        self.start = start
        self.end = end    def isPrimeNum(self, k):  #判断是否是素数
        if k < 2:            return False
        for i in range(2, k):            if k % i == 0:                return False
        return True

    def __iter__(self):
        for k in range(self.start, self.end + 1):            if self.isPrimeNum(k):                yield kfor num in PrimeNumbers(2, 100):
    print(num)复制代码
登入後複製

如何進行反向迭代以及如何實現反向迭代

iter函數可以取得可迭代物件的正向迭代器,reversed函數則可以取得可迭代物件的反向迭代器。

l = [1, 2, 3, 4, 5]for x in reversed(l):
    print(x)复制代码
登入後複製

要實作反向迭代,實作__reversed__方法即可。

class FloatRange:
    def __init__(self, start, end, step=0.1):
        self.start = start
        self.end = end
        self.step = step    def __iter__(self):
        t = self.start        while t <= self.end:            yield t
            t += self.step    def __reversed__(self):
        t = self.end        while t >= self.start:            yield t
            t -= self.stepfor x in FloatRange(1.0, 4.0, 0.5):
    print(x)for x in reversed(FloatRange(1.0, 4.0, 0.5)):
    print(x)复制代码
登入後複製

如何對迭代器做切片操作

itertools套件中的islice函數,可以可迭代物件進行切片操作。

from itertools import islicefor x in islice(FloatRange(1.0, 4.0, 0.5), 2, 5):
    print(x)复制代码
登入後複製

如何在一個for語句中迭代多個可迭代物件

使用zip方法,將對應元素組成一個元組。

for w, e, m in zip([1, 2, 3, 4], ('a', 'b', 'c','d'), [5, 6, 7, 8]):
    print(w, e, m)复制代码
登入後複製

使用itertools套件中的chain函數,將多個可迭代物件串聯起來。 使用zip方法,將對應元素組成一個元組。

from itertools import chainfor x in chain([1, 2, 3, 4], ('a', 'b', 'c','d')):
    print(x)复制代码
登入後複製

以上是寫給Python程式設計高手2:迭代器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

C#中如何使用迭代器和遞歸演算法處理數據 C#中如何使用迭代器和遞歸演算法處理數據 Oct 08, 2023 pm 07:21 PM

C#中如何使用迭代器和遞歸演算法處理數據,需要具體程式碼範例在C#中,迭代器和遞歸演算法是兩種常用的數據處理方法。迭代器可以幫助我們遍歷集合中的元素,而遞歸演算法則能夠有效地處理複雜的問題。本文將詳細介紹如何使用迭代器和遞歸演算法來處理數據,並提供具體的程式碼範例。使用迭代器處理資料在C#中,我們可以使用迭代器來遍歷集合中的元素,而無需事先知道集合的大小。透過迭代器,我

如何使用Python在Linux中進行腳本編寫和執行 如何使用Python在Linux中進行腳本編寫和執行 Oct 05, 2023 am 11:45 AM

如何使用Python在Linux中進行腳本編寫和執行在Linux作業系統中,我們可以使用Python編寫並執行各種腳本。 Python是一種簡潔而強大的程式語言,它提供了豐富的函式庫和工具,使得腳本編寫變得更加簡單和有效率。以下我們將介紹在Linux中如何使用Python進行腳本編寫和執行的基本步驟,同時提供一些具體的程式碼範例來幫助你更好地理解和運用。安裝Pytho

Python中sqrt()函數用法 Python中sqrt()函數用法 Feb 21, 2024 pm 03:09 PM

Python中sqrt()函數用法及程式碼範例一、sqrt()函數的功能及介紹在Python程式設計中,sqrt()函數是math模組中的一個函數,其功能是計算一個數的平方根。平方根是指一個數與自己相乘等於這個數的平方,即x*x=n,則x就是n的平方根。程式中可以使用sqrt()函數來實現對平方根的計算。二、sqrt()函數的使用方法在Python中,sq

Python程式設計解析百度地圖API文件中的座標轉換功能 Python程式設計解析百度地圖API文件中的座標轉換功能 Aug 01, 2023 am 08:57 AM

Python程式解析百度地圖API文件中的座標轉換功能導讀:隨著網路的快速發展,地圖定位功能已成為現代人生活中不可或缺的一部分。而百度地圖作為國內最受歡迎的地圖服務之一,提供了一系列的API供開發者使用。本文將透過Python編程,解析百度地圖API文件中的座標轉換功能,並給出對應的程式碼範例。一、引言在開發中,我們有時會涉及到座標的轉換問題。百度地圖AP

教你使用Python程式實現百度影像辨識介面的對接,實現影像辨識功能 教你使用Python程式實現百度影像辨識介面的對接,實現影像辨識功能 Aug 25, 2023 pm 03:10 PM

教你使用Python程式實現百度影像辨識介面的對接,實現影像辨識功能在電腦視覺的領域中,影像辨識技術是非常重要的一項技術。而百度提供了一套強大的圖像識別接口,透過該接口,我們可以方便地實現圖像的分類、標籤、人臉識別等功能。本篇文章將教你使用Python程式語言,透過對接百度影像辨識接口,實現影像辨識的功能。首先,我們需要在百度開發者平台上創建一個應用,並獲

如何用Python寫PCA主成分分析演算法? 如何用Python寫PCA主成分分析演算法? Sep 20, 2023 am 10:34 AM

如何用Python寫PCA主成分分析演算法? PCA(PrincipalComponentAnalysis)是一種常用的無監督學習演算法,用於降低資料維度,從而更好地理解和分析資料。在這篇文章中,我們將學習如何使用Python編寫PCA主成分分析演算法,並提供具體的程式碼範例。 PCA的步驟如下:標準化資料:將資料每個特徵的平均值歸零,並調整變異數到相同的範圍,以確保

如何在Python中進行影像處理與識別 如何在Python中進行影像處理與識別 Oct 20, 2023 pm 12:10 PM

如何在Python中進行影像處理和識別摘要:現代技術使得影像處理和識別在許多領域中成為了一個重要的工具。 Python作為一種易於學習和使用的程式語言,具有豐富的圖像處理和識別庫。本文將介紹如何使用Python進行影像處理和識別,並提供具體的程式碼範例。影像處理:影像處理是對影像進行各種操作和變換以改善影像品質、擷取影像中的資訊等。 Python中的PIL函式庫(Pi

如何透過Python編寫程式取得百度地圖API中的地圖瓦片? 如何透過Python編寫程式取得百度地圖API中的地圖瓦片? Jul 31, 2023 pm 04:21 PM

如何透過Python編寫程式取得百度地圖API中的地圖瓦片?地圖瓦片是構成地圖的基本元素,透過將地圖劃分為小塊獨立的圖像,可以實現更快速的地圖載入和顯示。百度地圖API提供了豐富的地圖瓦片數據,本文將介紹如何使用Python獲取百度地圖API中的地圖瓦片,並給出程式碼範例。取得百度地圖API的地圖瓦片需要使用到該介面提供的金鑰(ak),因此,首先需要在百度地圖

See all articles