国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python:可迭代對象與迭代器

這篇具有很好參考價值的文章主要介紹了Python:可迭代對象與迭代器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

相關閱讀

Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482


? ? ? ? 根據Python官方文檔,可迭代對象(iterable)是“一種能夠逐個返回其成員項的對象”。具體來說,這種對象要么定義了一個返回迭代器(iterator)的魔術方法__iter__(),要么定義了魔術方法__getitem__(),并使用從0開始的整數索引。

? ? ? ? Python中的一些內置類型就是可迭代對象,比如列表(list)、元組(tuple)、range對象、字符串(str)、字典(dict)、集合(set),下面的例子檢測了這些類型是否擁有__iter__()方法或__getitem__()方法:

List  = [1, 2, 3]
Tuple = (1, 2, 3)
Range = range(1, 4)
Str   = 'hello, world!'
Dict  = {'name': 'Alice', 'age': 13, 'gender': 'Female'}
Set   = {1, 2, 3}

# 檢測是否包含 __getitem__ 方法
print("List has __getitem__:", hasattr(List, '__getitem__'))
print("Tuple has __getitem__:", hasattr(Tuple, '__getitem__'))
print("Range has __getitem__:", hasattr(Range, '__getitem__'))
print("Str has __getitem__:", hasattr(Str, '__getitem__'))
print("Dict has __getitem__:", hasattr(Dict, '__getitem__'))
print("Set has __getitem__:", hasattr(Set, '__getitem__'))

# 檢測是否包含 __iter__ 方法
print("List has __iter__:", hasattr(List, '__iter__'))
print("Tuple has __iter__:", hasattr(Tuple, '__iter__'))
print("Range has __iter__:", hasattr(Range, '__iter__'))
print("Str has __iter__:", hasattr(Str, '__iter__'))
print("Dict has __iter__:", hasattr(Dict, '__iter__'))
print("Set has __iter__:", hasattr(Set, '__iter__'))

? ? ? ? 結果顯示,它們大多都實現了這兩個魔術方法,除了集合沒有實現__getitem__()方法,如下所示。

輸出:
List has __getitem__: True
Tuple has __getitem__: True
Range has __getitem__: True
Str has __getitem__: True
Dict has __getitem__: True
Set has __getitem__: False
List has __iter__: True
Tuple has __iter__: True
Range has __iter__: True
Str has __iter__: True
Dict has __iter__: True
Set has __iter__: True

????????collections.abc.Iterable是一個基類,可以用它檢測一個對象是否擁有__iter__()方法,如下所示。

from collections.abc import Iterable
# 檢測是否含有__iter__()
print("List is Iterable:", isinstance(List, Iterable))
print("Tuple is Iterable:", isinstance(Tuple, Iterable))
print("Range is Iterable:", isinstance(Range, Iterable))
print("Str is Iterable:", isinstance(Str, Iterable))
print("Dict is Iterable:", isinstance(Dict, Iterable))
print("Set is Iterable:", isinstance(Set, Iterable))
# 輸出:
List is Iterable: True
Tuple is Iterable: True
Range is Iterable: True
Str is Iterable: True
Dict is Iterable: True
Set is Iterable: True

? ? ? ? 但這不是一個可靠的檢測方式,因為如果一個可迭代對象只擁有__getitem__()方法,則這種方式就會失效。一個可靠的方式是使用Python內置函數iter()。

? ? ? ? 可迭代對象可以使用內置函數iter()轉化為迭代器(iterator),iter()函數首先會嘗試調用可迭代對象的__iter__()方法返回一個迭代器(是否是迭代器是根據返回對象是否擁有__next__方法檢測的,如返回的不是迭代器則會產生TypeError異常: iter() returned non-iterator of type ***),如果不存在__iter__()方法,則會尋找是否有索引從0開始的__getitem__()方法并嘗試創(chuàng)建一個迭代器,如果仍然不存在,則會引發(fā)TypeError異常。

? ? ? ? 下面展示了一些內置類型使用iter()函數創(chuàng)建的迭代器,直接使用__iter__()方法也可返回迭代器,但它不檢測返回的是否是迭代器,因此最好使用iter()函數。

# 檢測迭代器的類型
ListIter = iter(List)    # 直接使用List.__iter__()方法也可返回迭代器
print(type(ListIter))  
TupleIter = iter(Tuple)  # 直接使用Tuple.__iter__()方法也可返回迭代器
print(type(TupleIter))
RangeIter = iter(Range)  # 直接使用Range.__iter__()方法也可返回迭代器
print(type(RangeIter))
StrIter = iter(Str)      # 直接使用Str.__iter__()方法也可返回迭代器
print(type(StrIter))
DictIter = iter(Dict)    # 直接使用Dict.__iter__()方法也可返回迭代器
print(type(DictIter))
SetIter = iter(Set)      # 直接使用Set.__iter__()方法也可返回迭代器
print(type(SetIter))

# 輸出:
<class 'list_iterator'>
<class 'tuple_iterator'>
<class 'range_iterator'>
<class 'str_iterator'>
<class 'dict_keyiterator'>
<class 'set_iterator'>

? ? ? ? 迭代器擁有__iter__()方法(用于返回自己,因此迭代器本身也是可迭代對象),和__next__()方法(用于迭代)。

? ? ? ? for循環(huán)其實就是迭代的過程,首先會調用iter()函數為可迭代對象創(chuàng)建一個未命名的迭代器,再循環(huán)的過程中調用__next__()方法進行迭代,直到迭代器耗盡,觸發(fā)StopIteration異常并停止循環(huán),并銷毀未命名的迭代器。

? ? ? ? 使用內置函數next()也可以進行迭代,它們之間的差別不大,如下所示。

# 使用列表迭代器
print(next(ListIter))
print(ListIter.__next__()) 
print(next(ListIter))
print(ListIter.__next__()) 

# 輸出:
1
2
3
StopIteration Traceback (most recent call last)

? ? ? ? 注意從 Python 3.7 開始,字典的遍歷順序一定和輸入順序一樣。所以字典迭代器的迭代順序是確定的,對字典使用iter()函數,默認返回的是針對鍵的迭代器,可以通過使用values()方法或items()方法明確指定想要遍歷的元素,并返回相應的迭代器。

# 使用字典迭代器
print(next(DictIter))
print(next(DictIter))
print(next(DictIter))

ValueIter = iter(Dict.values())
print(next(ValueIter))
print(next(ValueIter))
print(next(ValueIter))

輸出:
name
age
gender
Alice
13
Female

? ? ? ? 集合迭代器無法保證遍歷順序,因此不應該對此有任何期待。

? ? ? ? 下面的例子定義了一個,只含有__getitem__()方法的可迭代對象,并直接使用循環(huán)迭代,還創(chuàng)建了一個迭代器并用next()函數進行迭代。

class MyIterable:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

# 示例用法
my_iterable = MyIterable([1, 2, 3, 4, 5])

for item in my_iterable:
    print(item)

my_iterator = iter(my_iterable)
print(next(my_iterator))
print(next(my_iterator))
print(next(my_iterator))

輸出:
1
2
3
4
5
1
2
3

? ? ? ? 迭代器對象只能按照順序前行,無法后退,這意味著對于一個迭代器對象,只能遍歷一輪,如果想要多輪迭代,可以重新創(chuàng)建迭代器。

? ? ? ? 寫這篇文章的起因,是接觸了神經網絡框架Pytorch中的torchvision.datasets包,里面定義了很多數據集,它們是擁有__getitem__()方法的可迭代對象,因此可以使用索引訪問,而dataloader是擁有__iter__()方法的可迭代對象,所以不可以使用索引訪問。文章來源地址http://www.zghlxwxcb.cn/news/detail-861486.html

到了這里,關于Python:可迭代對象與迭代器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • python pip 相關緩存清理(windows+linux)

    python pip 相關緩存清理(windows+linux)

    pip會大量緩存,如果全部堆在系統(tǒng)盤,會造成別的無法使用 windows和linux通用 linux是在命令行操作 1.查看緩存位置 我這里默認是在/root/.cache/pip 2.查看大小 結果如下: 3.清理(推薦) 使用pip自己的命令即可,這種方法不會清理完,因為有些是可能需要用到的,pip不會進行清理

    2024年01月22日
    瀏覽(21)
  • 【Python】如何在服務器上優(yōu)雅的部署Python項目(Linux/Windows/Mac)

    【Python】如何在服務器上優(yōu)雅的部署Python項目(Linux/Windows/Mac)

    一般每個不同的項目都會依賴各自的庫,有些庫的版本不一樣會引起沖突,為了解決這個問題,需要使用 虛擬環(huán)境 ,Python可以在 每個項目目錄下創(chuàng)建各自的虛擬環(huán)境 , 項目所依賴的包就在當前目錄環(huán)境下 ,這樣避免了 庫版本的沖突 ,也方便相同操作系統(tǒng)間可以快速的拷

    2024年04月11日
    瀏覽(21)
  • python迭代器

    作者:吳業(yè)亮 博客:wuyeliang.blog.csdn.net 一、使用場景 遍歷大型數據集合:當處理大型數據集合時,迭代器可以逐個返回元素,而不需要一次性將整個集合加載到內存中。這可以節(jié)省內存空間,并在需要時按需加載數據。 像文件一樣逐行讀取數據:當處理大型文本文件時,使

    2024年02月12日
    瀏覽(28)
  • python中的迭代器

    什么是迭代器 如何生成迭代器 迭代器的用法 迭代器是為了給迭代對象進行迭代使用的。迭代也就是遍歷,可以從頭到尾的遍歷所有的元素。列表、集合、元組、字典、字符串、都是可迭代對象。如果一個對象擁有_iter方法,其是可迭代對象。 生成器(Generator)在 Python 中具

    2024年02月08日
    瀏覽(23)
  • Python迭代器(Iterator)

    迭代是訪問集合元素的一種方式 迭代器是一個可以記住遍歷位置的對象。迭代器對象從第一個元素開始訪問,直到所有的元素被訪問結束。迭代器只能往前不會后退。 能用for循環(huán)遍歷的對象 for循環(huán)的過程可以通過上面的iter()和next()函數來實現,即: 1、先調用iter(),將nums當

    2024年02月15日
    瀏覽(20)
  • Python基礎之迭代器

    迭代器即是用來迭代取值的工具,而迭代是重復反饋取值的過程,其目的通常是為了逼近所需的目標或結果,每一次對過程的重復稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值,單純的重復并不是迭代。 例如: 這只是一個單純的循環(huán),不是迭代。

    2023年04月23日
    瀏覽(27)
  • 【Python】新手入門(8):什么是迭代?迭代的作用是什么?

    【Python】新手入門(8):什么是迭代?迭代的作用是什么?

    【Python】新手入門(8):什么是迭代?迭代有什么應用? ?? 個人主頁:高斯小哥 ?? 高質量專欄:Matplotlib之旅:零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程?? 希望得到您的訂閱和支持~ ?? 創(chuàng)作高質量博文(平均質量分92+),分享更多關于深度

    2024年03月10日
    瀏覽(73)
  • 【Python入門】Python搭建編程環(huán)境-安裝Python3解釋器(內含Windows版本、MacOS版本、Linux版本)

    【Python入門】Python搭建編程環(huán)境-安裝Python3解釋器(內含Windows版本、MacOS版本、Linux版本)

    前言 ??作者簡介: 熱愛跑步的恒川 ,致力于C/C++、Java、Python等多編程語言,熱愛跑步,喜愛音樂的一位博主。 ??本文收錄于Python零基礎入門系列,本專欄主要內容為Python基礎語法、判斷、循環(huán)語句、函數、函數進階、數據容器、文件操作、異常模塊與包、數據可視化等,

    2024年02月03日
    瀏覽(96)
  • Python迭代器模式介紹、使用

    Python迭代器模式是一種設計模式,它提供了一種訪問容器對象中各個元素的統(tǒng)一接口,而不必暴露容器內部的細節(jié)。 在Python中,迭代器是指實現了__next__()方法的對象,這個方法返回容器中下一個元素,并在容器末尾時拋出StopIteration異常。通過使用迭代器模式,我們可以很方

    2024年02月15日
    瀏覽(46)
  • python算法二:迭代法

    1.定義:迭代法也稱輾轉法,是一種不斷用變量的舊值遞推新值的過程,跟迭代法相對應的是直接法(或者稱為一次解法),即一次性解決問題。迭代算法是用計算機解決問題的一種基本方法,它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對一組指令(或一定步

    2024年02月06日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包