欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

元素操作函數(shù)python,元素常用操作

Python|range函數(shù)用法完全解讀

迭代器是 23 種設計模式中最常用的一種(之一),在 Python 中隨處可見它的身影,我們經(jīng)常用到它,但是卻不一定意識到它的存在。在關于迭代器的系列文章中(鏈接見文末),我至少提到了 23 種生成迭代器的方法。有些方法是專門用于生成迭代器的,還有一些方法則是為了解決別的問題而“暗中”使用到迭代器。

創(chuàng)新互聯(lián)建站主營平橋網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,App定制開發(fā),平橋h5成都小程序開發(fā)搭建,平橋網(wǎng)站營銷推廣歡迎平橋等地區(qū)企業(yè)咨詢

在系統(tǒng)學習迭代器之前,我一直以為 range() 方法也是用于生成迭代器的,現(xiàn)在卻突然發(fā)現(xiàn),它生成的只是可迭代對象,而并不是迭代器! (PS:Python2 中 range() 生成的是列表,本文基于Python3,生成的是可迭代對象)

于是,我有了這樣的疑問:為什么 range() 不生成迭代器呢?在查找答案的過程中,我發(fā)現(xiàn)自己對 range 類型的認識存在一些誤區(qū)。因此,本文將和大家全面地認識一下 range ,期待與你共同學習進步。

1、range() 是什么?

它的語法:range(start, stop [,step]) ;start 指的是計數(shù)起始值,默認是 0;stop 指的是計數(shù)結束值,但不包括 stop ;step 是步長,默認為 1,不可以為 0 。range() 方法生成一段左閉右開的整數(shù)范圍。

對于 range() 函數(shù),有幾個注意點:(1)它表示的是左閉右開區(qū)間;(2)它接收的參數(shù)必須是整數(shù),可以是負數(shù),但不能是浮點數(shù)等其它類型;(3)它是不可變的序列類型,可以進行判斷元素、查找元素、切片等操作,但不能修改元素;(4)它是可迭代對象,卻不是迭代器。

2、 為什么range()不生產(chǎn)迭代器?

可以獲得迭代器的內(nèi)置方法很多,例如 zip() 、enumerate()、map()、filter() 和 reversed() 等等,但是像 range() 這樣僅僅得到的是可迭代對象的方法就絕無僅有了(若有反例,歡迎告知)。這就是我存在知識誤區(qū)的地方。

在 for-循環(huán) 遍歷時,可迭代對象與迭代器的性能是一樣的,即它們都是惰性求值的,在空間復雜度與時間復雜度上并無差異。我曾概括過兩者的差別是“一同兩不同”:相同的是都可惰性迭代,不同的是可迭代對象不支持自遍歷(即next()方法),而迭代器本身不支持切片(即 getitem () 方法)。

雖然有這些差別,但很難得出結論說它們哪個更優(yōu)。現(xiàn)在微妙之處就在于,為什么給 5 種內(nèi)置方法都設計了迭代器,偏偏給 range() 方法設計的就是可迭代對象呢?把它們都統(tǒng)一起來,不是更好么?

事實上,Pyhton 為了規(guī)范性就干過不少這種事,例如,Python2 中有 range() 和 xrange() 兩種方法,而 Python3 就干掉了其中一種,還用了“李代桃僵”法。為什么不更規(guī)范點,令 range() 生成的是迭代器呢?

關于這個問題,我沒找到官方解釋,以下純屬個人觀點 。

zip() 等方法都需要接收確定的可迭代對象的參數(shù),是對它們的一種再加工的過程,因此也希望馬上產(chǎn)出確定的結果來,所以 Python 開發(fā)者就設計了這個結果是迭代器。這樣還有一個好處,即當作為參數(shù)的可迭代對象發(fā)生變化的時候,作為結果的迭代器因為是消耗型的,不會被錯誤地使用。

而 range() 方法就不同了,它接收的參數(shù)不是可迭代對象,本身是一種初次加工的過程,所以設計它為可迭代對象,既可以直接使用,也可以用于其它再加工用途。例如,zip() 等方法就完全可以接收 range 類型的參數(shù)。

也就是說,range() 方法作為一種初級生產(chǎn)者,它生產(chǎn)的原料本身就有很大用途,早早把它變?yōu)榈鞯脑挘瑹o疑是一種畫蛇添足的行為。

對于這種解讀,你是否覺得有道理呢?歡迎就這個話題與我探討。

3、range 類型是什么?

以上是我對“為什么range()不產(chǎn)生迭代器”的一種解答。順著這個思路,我研究了一下它產(chǎn)生的 range 對象,一研究就發(fā)現(xiàn),這個 range 對象也并不簡單。

首先奇怪的一點就是,它竟然是不可變序列!我從未注意過這一點。雖然說,我從未想過修改 range() 的值,但這一不可修改的特性還是令我驚訝。

翻看文檔,官方是這樣明確劃分的——有三種基本的序列類型:列表、元組和范圍(range)對象。(There are three basic sequence types: lists, tuples, and range objects.)

這我倒一直沒注意,原來 range 類型居然跟列表和元組是一樣地位的基礎序列!我一直記掛著字符串是不可變的序列類型,不曾想,這里還有一位不可變的序列類型呢。

那 range 序列跟其它序列類型有什么差異呢?

普通序列都支持的操作有 12 種。range 序列只支持其中的 10 種,不支持進行加法拼接與乘法重復。

那么問題來了:同樣是不可變序列,為什么字符串和元組就支持上述兩種操作,而偏偏 range 序列不支持呢?雖然不能直接修改不可變序列,但我們可以將它們拷貝到新的序列上進行操作啊,為何 range 對象連這都不支持呢?

且看官方文檔的解釋:

…due to the fact that range objects can only represent sequences that follow a strict pattern and repetition and concatenation will usually violate that pattern.

原因是 range 對象僅僅表示一個遵循著嚴格模式的序列,而重復與拼接通常會破壞這種模式…

問題的關鍵就在于 range 序列的 pattern,仔細想想,其實它表示的就是一個等差數(shù)列啊(喵,高中數(shù)學知識沒忘…),拼接兩個等差數(shù)列,或者重復拼接一個等差數(shù)列,想想確實不妥,這就是為啥 range 類型不支持這兩個操作的原因了。由此推論,其它修改動作也會破壞等差數(shù)列結構,所以統(tǒng)統(tǒng)不給修改就是了。

4、小結

回顧全文,我得到了兩個偏冷門的結論:range 是可迭代對象而不是迭代器;range 對象是不可變的等差序列。

若單純看結論的話,你也許沒有感觸,或許還會說這沒啥了不得啊。但如果我追問,為什么 range 不是迭代器呢,為什么 range 是不可變序列呢?對這倆問題,你是否還能答出個自圓其說的設計思想呢?(PS:我決定了,若有機會面試別人,我必要問這兩個問題的嘿~)

由于 range 對象這細微而有意思的特性,我覺得這篇文章寫得值了。本文是作為迭代器系列文章的一篇來寫的,所以對于迭代器的基礎知識介紹不多,另外,還有一種特殊的迭代器也值得單獨成文,那就是生成器了。

Python元組常用操作小技巧

所以這篇文章,我們先來回顧和總結Python數(shù)據(jù)結構里常用操作。Python中常見的數(shù)據(jù)結構可以統(tǒng)稱為容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。而扁平序列如str、bytes、bytearray、memoryview 和 array.array等不在這篇文章的討論范圍內(nèi)。

在此,我們先從元組開始說起。

元組區(qū)別于列表的顯著特征之一就是它不能被修改,但其另外一個作用就是 用于沒有字段名的記錄 [1] 。因為后者經(jīng)常被忽略,我們先來看看元組作為記錄的作用。

使用括號就可以定義一個元組。元組中的每個元素都存放了記錄中一個字段的數(shù)據(jù),外加這個字段的位置。正是這個位置信息給數(shù)據(jù)賦予了意義。下面的例子中,元組就被當作記錄加以利用:

輸出為:

上述for循環(huán)中的操作提取了元組中的元素,也叫作拆包(unpacking)。平行賦值是對元組拆包很好的應用,示例如下:

還有一個經(jīng)典而優(yōu)雅的應用是交換變量的值:

用 * 運算符把一個可迭代對象拆開作為函數(shù)的參數(shù),例如Python的內(nèi)置函數(shù)pmod接收兩個數(shù)字類型的參數(shù),返回商和余數(shù)。以下范例將使用 * 將元組傳入函數(shù)。

輸出為:

有些函數(shù)有多個返回值,將其賦給一個變量時,變量類型即是元組:

輸出為:

zip是Python的內(nèi)置函數(shù),能夠接收兩個或多個序列,并組成一個元組列表,在Python3中會返回一個迭代器,如下所示:

輸出為:

元組當然也支持一些常規(guī)操作,如對于元組 a = (1, 'y', 5, 5, 'x') :

上述內(nèi)容不僅涵蓋了元組的基本操作,同時也結合了實際工作中常搭配使用的其他函數(shù)、運算符等。在回顧這些知識時主要參考了兩本經(jīng)典的Python編程書籍:《流暢的Python》和《像計算機科學家一樣思考Python》,有興趣的朋友可以深入閱讀!

希望這篇文章對你有幫助,下回將總結Python列表的使用技巧。

[1]《流暢的Python》:

如何利用Python自動完成對網(wǎng)頁平臺上可點擊的元素操作,用什么模塊,具體函數(shù)有哪些,請大神指教

用selenium就可以了,它模擬打開瀏覽器,打開網(wǎng)頁。

通過頁面元素的特征,定位到要點擊的元素,click()方法就可以完成點擊

比如

self.driver.find_element_by_xpath('//ul[@class="uhomeTagList-ul"]/li[2]').click()

Python中在列表中任意位置插入一個元素的函數(shù)是什么

1、insert: insert(index,obj)

2、count:count(obj)

3、remove:remove(obj)

python常用函數(shù)

1、complex()

返回一個形如?a+bj?的復數(shù),傳入?yún)?shù)分為三種情況:

參數(shù)為空時,返回0j;參數(shù)為字符串時,將字符串表達式解釋為復數(shù)形式并返回;參數(shù)為兩個整數(shù)(a,b)時,返回?a+bj;參數(shù)只有一個整數(shù) a 時,虛部 b 默認為0,函數(shù)返回?a+0j。

2、dir()

不提供參數(shù)時,返回當前本地范圍內(nèi)的名稱列表;提供一個參數(shù)時,返回該對象包含的全部屬性。

3、divmod(a,b)

a -- 代表被除數(shù),整數(shù)或浮點數(shù);b -- 代表除數(shù),整數(shù)或浮點數(shù);根據(jù) 除法運算 計算 a,b 之間的商和余數(shù),函數(shù)返回一個元組(p,q)?,p 代表商?a//b?,q 代表余數(shù)?a%b。

4、enumerate(iterable,start=0)

iterable -- 一個可迭代對象,列表、元組序列等;start -- 計數(shù)索引值,默認初始為0‘該函數(shù)返回枚舉對象是個迭代器,利用 next() 方法依次返回元素值,每個元素以元組形式存在,包含一個計數(shù)元素(起始為 start )和 iterable 中對應的元素值。

網(wǎng)站標題:元素操作函數(shù)python,元素常用操作
轉載來源:http://chinadenli.net/article24/dsejpce.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司企業(yè)建站服務器托管網(wǎng)站設計公司響應式網(wǎng)站網(wǎng)頁設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化