成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Python:range 對(duì)象并不是迭代器

draveness / 3388人閱讀

摘要:簡(jiǎn)評(píng)迭代器是惰性可迭代對(duì)象,函數(shù)在中是一個(gè)惰性的可迭代對(duì)象,那么是不是迭代器呢為什么。如果你不能將某些東西傳遞給函數(shù),那么它不是一個(gè)迭代器。的對(duì)象不是迭代器。

簡(jiǎn)評(píng):迭代器(iterator)是惰性可迭代對(duì)象(lazy iterable),range 函數(shù)在 Python 3 中是一個(gè)惰性的可迭代對(duì)象,那么 range 是不是迭代器呢?為什么。

TLNR:Python 3 中的 range 對(duì)象(Python 2 中的 xrange 對(duì)象)是 lazy 的,但 range 對(duì)象卻不是迭代器。

是的,這讓人很困惑

當(dāng)談?wù)?Python 中的迭代器(iterator)和可迭代對(duì)象(iterable)時(shí),你很可能會(huì)聽(tīng)到有人重復(fù) range 是迭代器的誤解。我認(rèn)為這是非常嚴(yán)重誤解, 如果你認(rèn)為 range 對(duì)象是迭代器,那么你關(guān)于「迭代器是如何運(yùn)行」的心智模型還不夠清楚。從某種意義上來(lái)說(shuō),range 和迭代器都是「惰性」的,但它們是以相當(dāng)不同的方式實(shí)現(xiàn)「惰性」的。

什么是迭代器(iterator)

在 Python 中,可迭代對(duì)象就是你可以迭代的任何東西,而迭代器就是實(shí)際迭代的東西。

Iter-ables are able to be iterated over. Iter-ators are the agents that perform the iteration.

可以使用 iter 函數(shù)從任何可迭代對(duì)象中獲取迭代器:

一旦有了迭代器,可以用它做的唯一的事情就是獲得它的下一個(gè)元素:

如果沒(méi)有更多的元素了, 則會(huì)拋出一個(gè) stop iteration exception:

所有的迭代器都是可迭代對(duì)象,意思是你可以從一個(gè)迭代器中得到一個(gè)迭代器,因此你可以遍歷一個(gè)迭代器:

應(yīng)該指出的是迭代器是有狀態(tài)的,在循環(huán)遍歷一次迭代器后,如果嘗試再次循環(huán),它將為空:

在 Python 3 中,enumerate、zip、reversed和其他一些內(nèi)置函數(shù)會(huì)返回迭代器:

生成器(無(wú)論來(lái)自生成器函數(shù)還是生成器表達(dá)式)是一種創(chuàng)建迭代器的簡(jiǎn)單方法:

我經(jīng)常說(shuō)迭代器是惰性的一次性可迭代對(duì)象。 「惰性」是因?yàn)樗麄冎谎h(huán)計(jì)算項(xiàng)目,「單次使用是因?yàn)橐坏囊粋€(gè)迭代器中「消費(fèi)」了一個(gè)元素之后,這個(gè)元素就永遠(yuǎn)消失了。

什么是 range

Python 3 中的 range 對(duì)象(Python 2 中的 xrange)可以像任何其他可迭代對(duì)象一樣循環(huán)使用:

因?yàn)?range 是可迭代對(duì)象,所以可以從中得到一個(gè)迭代器:

但 range 對(duì)象本身不是迭代器,我們不能在 range 對(duì)象上調(diào)用 next:

與迭代器不同的是,我們可以遍歷一個(gè) range 對(duì)象而不「消耗」它:

如果我們使用迭代器完成此操作,則第二次循環(huán)時(shí)不會(huì)得到任何元素:

宗上,與 zip, enumerate, or generator對(duì)象不同,range 對(duì)象不是迭代器。

那么,究竟 range 是什么

range 對(duì)象在某種意義上是「惰性的」,因?yàn)樗粫?huì)生成創(chuàng)建時(shí)包含的每個(gè)數(shù)字,相反,當(dāng)我們?cè)谘h(huán)中需要的時(shí)候,它才將這些數(shù)字返回給我們。

下面是一個(gè) range 對(duì)象和一個(gè)生成器(是一種迭代器):

不像生成器,range 對(duì)象有長(zhǎng)度:

并且可以被索引:

與迭代器不同,你可以詢問(wèn)他們是否包含某元素而不改變他們的狀態(tài):

如果你想要一個(gè) range 對(duì)象的描述,可以稱它們?yōu)閼行蛄?,range 是序列(如列表,元組和字符串),但并不包含任何內(nèi)存中的內(nèi)容,而是通過(guò)計(jì)算來(lái)回答問(wèn)題。

為什么這個(gè)區(qū)別很重要

如果我告訴你某個(gè)對(duì)象是一個(gè)迭代器,你會(huì)知道當(dāng)在這個(gè)對(duì)象上調(diào)用 iter 函數(shù)時(shí),總會(huì)得到相同的的對(duì)象(按照定義):

確信可以在這個(gè)對(duì)象上調(diào)用 next 函數(shù),因?yàn)榭梢栽谒械牡魃险{(diào)用 next 函數(shù):

而且你會(huì)知道,當(dāng)遍歷它時(shí),這些元素將從迭代器中被消耗掉,有時(shí)候這個(gè)特性可以派上用場(chǎng)(以特殊的方式處理迭代器):

所以雖然看起來(lái)「惰性可迭代對(duì)象」和「迭代器」之間的區(qū)別很微妙,但這些術(shù)語(yǔ)確實(shí)意味著不同的東西。 雖然「惰性可迭代對(duì)象」是一個(gè)沒(méi)有具體含義的非常普遍的術(shù)語(yǔ),但「迭代器」這個(gè)詞意味著一個(gè)具有非常特定行為的對(duì)象。

總結(jié)

如果你知道你可以循環(huán)遍歷某個(gè)對(duì)象,這是一個(gè)可迭代對(duì)象(iterable)。

如果你知道你正在循環(huán)遍歷的對(duì)象是在循環(huán)的時(shí)候計(jì)算出來(lái),那么這是一個(gè)惰性可迭代對(duì)象(lazy iterable)。

如果你知道你可以傳遞一些東西給 next 函數(shù),它就是一個(gè)迭代器(這是最常見(jiàn)的惰性可迭代對(duì)象)。

如果你可以循環(huán)多次而不用「耗盡」它,它不是一個(gè)迭代器。如果你不能將某些東西傳遞給 next 函數(shù),那么它不是一個(gè)迭代器。 Python 3 的 range 對(duì)象不是迭代器。 如果你正在指導(dǎo)別人關(guān)于 range 對(duì)象的知識(shí),請(qǐng)不要使用「迭代器」一詞,這會(huì)讓人十分困惑,并可能導(dǎo)致他人開(kāi)始濫用「迭代器」這個(gè)詞。

原文:Python: range is not an iterator!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44627.html

相關(guān)文章

  • 為什么range不是迭代?range到底是什么類型?

    摘要:為什么不更規(guī)范點(diǎn),令生成的是迭代器呢關(guān)于這個(gè)問(wèn)題,我沒(méi)找到官方解釋,以下純屬個(gè)人觀點(diǎn)。類型是什么以上是我對(duì)為什么不產(chǎn)生迭代器的一種解答。小結(jié)回顧全文,我得到了兩個(gè)偏冷門的結(jié)論是可迭代對(duì)象而不是迭代器對(duì)象是不可變的等差序列。 showImg(https://segmentfault.com/img/bVbmKjd?w=6000&h=4000); 迭代器是 23 種設(shè)計(jì)模式中最常用的一種(...

    187J3X1 評(píng)論0 收藏0
  • Python標(biāo)準(zhǔn)庫(kù)---11、內(nèi)置類型:迭代類型、序列類型(list-typle-range

    摘要:上一篇文章標(biāo)準(zhǔn)庫(kù)內(nèi)置類型數(shù)字類型下一篇文章標(biāo)準(zhǔn)庫(kù)內(nèi)置類型文本序列類型迭代器類型支持在容器中進(jìn)行迭代的概念。該對(duì)象需要支持下文所述的迭代器協(xié)議。這是同時(shí)允許容器和迭代器配合和語(yǔ)句使用所必須的。 上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---10、內(nèi)置類型:數(shù)字類型下一篇文章:Python標(biāo)準(zhǔn)庫(kù)---12、內(nèi)置類型:文本序列類型(str) ## 迭代器類型Python 支持在容器中進(jìn)行迭代的概念。...

    syoya 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<