Python序列詳解

2021-03-02 BAT程式設計師

經過數個版本的發展,Python 的 「惰性」 大大增強。有幾個版本中已出現了在函數體中用 yield 語句定義的生成器。但是,在這個過程中,還出現了 itertools 模塊,它可以組合和創建各種類型的迭代器。還出現了 iter() 內置函數,它可以將許多類似於序列的對象轉換為迭代器。在 Python 2.4 中,出現了生成器表達式(generator expression);在 2.5 中,出現了改進的生成器,這使編寫協同例程更為輕鬆。另外,越來越多的 Python 對象成為迭代器或類迭代器,例如,過去讀取文件需要使用 .xreadlines() 方法或 xreadlines 模塊,而現在 open() 的默認行為就能是讀取文件。

同樣,過去要實現 dict 的惰性循環遍歷需要使用 .iterkeys() 方法;現在,它是默認的 for key in dct 行為。xrange() 這樣的函數與生成器類似的方面有些 「特殊」,它們既不是真正的 迭代器(沒有 .next() 方法),也不是實際的列表(比如 range() 返回的列表)。但是,enumerate() 返回一個真正的生成器,通常會實現以往希望 xrange() 實現的功能。itertools.count() 是另一個惰性調用,它的作用與 xrange()幾乎 完全相同,但它是一個功能完備的迭代器。

Python 的發展大方向是以惰性方式構造類似於序列的對象;總體來說,這個方向是正確的。惰性的偽序列既可以節省內存空間,還可以提高操作的速度(尤其是在處理非常大的與序列類似的 「東西」 時)。

問題在於,Python 在判斷 「硬」 序列和迭代器之間的差異和相似性方面仍然不完善。這個問題最棘手的部分是,它實際上違背了 Python 的 「duck typing」 思想:只要給定的對象具有正確的行為,就能夠將它用於特定的用途,而不存在任何繼承或類型限制。迭代器或類迭代器有時表現得像序列,但有時候不是;反過來說,序列常常表現得像迭代器,但並非總是如此。表現不像迭代器那些序列已涉及 Python 的神秘領地,其作用尚不明朗。

分歧

所有類序列或類迭代器的主要相似之處是,它們都允許進行循環遍歷,無論是使用 for 循環、列表理解(list comprehension)還是生成器理解(generator comprehension)。除此之外,就出現了分歧。其中最重要的差異是,序列既可編制索引,也可直接切片(slice),而迭代器不能。實際上,為序列編制索引可能是最常用的序列操作 —— 究竟為什麼在迭代器上無法使用索引呢?例如:

清單 9. 與序列和迭代器相似的東西

1

2

3

4

5

6

7

8

9

>>> r = range(10)

 

>>> i = iter(r)

 

>>> x = xrange(10)

 

>>> g = itertools.takewhile(lambda n: n<10, itertools.count())

 

#...etc...

對於所有這一切,都可以使用 for n in thing。實際上,如果用 list(thing) 顯示它們,會得到完全相同的結果。但是,如果希望獲得其中的一個特定條目(或一些條目的切片),就需要考慮 thing 的具體類型。例如:

清單 10. 索引操作成功和失敗的示例

1

2

3

4

5

>>> r[4]

4

 

>>> i[4]

TypeError: unindexable object

對於每種序列/迭代器類型,只要費一番功夫,總能夠獲得其中的特定條目。一種方法是進行循環,直至到達所需的對象。另一種古怪的解決方案如下:

清單 11. 獲得索引的怪方法

1

2

3

4

>>> thing, temp = itertools.tee(thing)

 

>>> zip(temp, '.'*5)[-1][0]

4

對 itertools.tee() 的預調用保留了原始迭代器。對於切片,可以按照特殊方式使用 itertools.islice() 函數。

清單 12. 獲得一個切片的特殊方法

1

2

3

4

5

>>> r[4:9:2]

[4, 6, 8]

 

>>> list(itertools.islice(r,4,9,2))  # works for iterators

[4, 6, 8]

相關焦點

  • 序列比對在biopython中的處理
    序列比對是生物信息學分析中的常見任務,包含局部比對和全局比對兩大算法,局部比對最經典的代表是blast, 全局比對則用於多序列比對。在biopython中,支持對序列比對的結果進行讀寫,解析,以及運行序列比對的程序。
  • 使用biopython處理序列數據
    通過biopython, 我們可以方便的讀取這些格式的文件,並提取其中的信息。Bio.SeqIO其中Bio.Seq表示最原始的序列對象,是最核心的模塊,提供了序列的格式化,反向互補,鹼基計數等基本功能;Bio.SeqRecord表示序列記錄,在序列對象的基礎上,進一步添加了序列的id, 名稱,屬性等各種注釋信息;Bio.SeqIO模塊則用於讀取特定的文件格式,返回 SeqRecord對象。
  • python序列處理場景案例
    ## 序列的例子有限序列(C, Y, R)是一個字母序列,順序是C第一,Y第二,R第三。無限序列(a1, a2, .., an) 無限個元素按一定順序的排列空序列() 不包括任何元素的序列案例一:將序列分解為單獨的變量我們有一個包含N個元素的元組或序列,現在想將它分解為N個單獨的變量解決方案任何序列或可迭代對象都可以通過簡單的賦值操作來分解為單獨的變量
  • 集合:Python最後一類序列,序列知識點匯總
    主題Python基礎知識點「序列」已經進入第十一個章節,學完最後一類序列「集合」後,再對序列知識點進行總結。1、何為集合?3、列表、元組、字典、集合四類序列間的異常?集合定義:集合是Python中一種無序可變、元素不能重複的序列。
  • 時間序列預測方法總結
    觀察序列,當序列存在周期性時,線性回歸也可做為baseline3.傳統時序建模方法,ARMA/ARIMA等線性模型。參考:4.時間序列分解,使用加法模型或乘法模型將原始序列拆分為4部分。a.他們只說注意力機制(Attention Mechanism)不練,還是我來給大家擼代碼講解(https://juejin.im/post/5bbf41c3f265da0af16160d2#heading-0)《Attention is All You Need》淺讀(簡介+代碼)(https://kexue.fm/archives/4765)川陀學者:Attention機制詳解
  • python的模塊和序列
    前言概要本章節主要講述python中的模塊和序列的概念以及如何使用模塊和序列化方面的知識。模塊的概念在python中有個關鍵詞是import,代表的是導入、加載的意思。通常import加載的模塊分為四個通用類別:使用python語言編寫的代碼(後綴名為py的文件)已被編譯為共享庫或DLL的C或C++的擴展使用C編寫並連接到python解釋器的內置模塊
  • Fluent Python - Part2 序列構成的數組
    序列Python 使用統一的風格去處理序列數據,不管是哪種數據結構,它們都共用一套豐富的操作:迭代,切片,排序和拼接。
  • Python for循環及用法詳解
    Python 中的循環語句有 2 種,分別是 while 循環和 for 循環,前面章節已經對 while 做了詳細的講解,本節給大家介紹 for 循環,它常用於遍歷字符串、列表、元組、字典、集合等序列類型
  • 一個入門級python爬蟲教程詳解
    這篇文章主要介紹了一個入門級python爬蟲教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下
  • python時間序列平穩性檢驗專題及常見問題 - CSDN
    在做時間序列分析時,我們經常要對時間序列進行平穩性檢驗,而我們常用的軟體是SPSS或SAS,但實際上python也可以用來做平穩性檢驗,而且效果也非常好,今天筆者就講解一下如何用python來做時間序列的平穩性檢驗。首先我們還是來簡單介紹一下平穩性檢驗的相關概念。圖1.
  • 用Python進行時間序列分解和預測
    時間序列預測的需求不僅存在於各類業務場景當中,而且通常需要對未來幾年甚至幾分鐘之後的時間序列進行預測。如果你正要著手進行時間序列預測,那麼本文將帶你快速掌握一些必不可少的概念。什麼是時間序列?如何在Python中繪製時間序列數據?時間序列的要素是什麼?如何分解時間序列?經典分解法如何獲得季節性調整值?
  • Fluent Python - Part4 文本和字節序列
    人類使用文本,計算機使用字節序列--- Esther Nam 和 Travis Fischer本章內容基本沒啥用,平常也基本接觸不到多編碼類型的文本處理
  • Keras 實現 LSTM時間序列預測
    數據集採用來自業界多組相關時間序列(約40組)與外部特徵時間序列(約5組)。課題通過進行數據探索,特徵工程,傳統時序模型探索,機器學習模型探索,深度學習模型探索(RNN,LSTM等),算法結合,結果分析等步驟來學習時序預測問題的分析方法與實戰流程。
  • Python每天一分鐘:pass與assert語句詳解
    下面將為大家詳細介紹python中的pass和assert語句的功能與示例。python中的pass和assert語句pass語句詳解很多程式語言都提供了「空語句」支持,如C/C++/JAVAPython 也不例外,但由於Python的設計中剔除了分號作為終結代碼語句的支持, 所以python設計了單獨的關鍵字來支持空語句,即pass 語句.下面為大家演示pass語句的代碼:
  • Python 列表(List)操作方法詳解
    Python有6個序列的內置類型,但最常見的是列表和元組。序列都可以進行的操作包括索引,切片,加,乘,檢查成員。此外,Python已經內置確定序列的長度以及確定最大和最小的元素的方法。一、創建一個列表只要把逗號分隔的不同的數據項使用方括號括起來即可。
  • Python-random庫的基本應用
    偽隨機數:計算機中通過採用梅森旋轉算法生成的(偽)隨機序列元素,python中用於生成偽隨機數的函數庫是random概述這裡放幾個random庫常用函數:uniform()sample()shuffle()seed()詳解
  • Python時間序列數據分析--以示例說明
    向AI轉型的程式設計師都關注了這個號👇👇👇人工智慧大數據與深度學習  公眾號: datayx本文的內容主要來源於博客:https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python
  • Python函數的基本特徵詳解
    今天我們先拋出點兒理論:需要注意的是,函數在python中同在C語言中是有所不同的。第一:def引導一段可執行的代碼:def本身是一個可執行的語句,函數此時並不存在,直到python運行了def後,函數才存在,def後面包含的就是函數語句。
  • 手把手教你用Python進行時間序列分解和預測
    (給數據分析與開發加星標,提升數據技能)作者:Mohit Sharma   翻譯:數據派THU-王闖(Chuck)   預測是一件複雜的事情
  • Python基礎篇-08 Python版本區別,Python 3和Python 2區別詳解
    公眾號關注「專攻python」,設為「星標」重磅文章,第一時間送達!!