python中序列類型和數組之間的區別_「Python」序列構成的數組

一、Python 標準庫的序列類型分為:

容器序列:

能夠存放不同類型數據的序列(list、tuple、collections.deque)。

扁平序列:

只能容納一種類型的數據(str、bytes、bytearray 和 array.array)。

其中,容器序列存放的是它們所包含的任意類型的對象的引用,而扁平序列存放的是值而不是引用。換句話說,扁平序列是一段連續的內存空間,更加緊湊,但其內只能存放如數值、字符和字節等基礎類型。

二、而依據序列能否被修改,還能分為:

可變序列:

list、bytearray、array.array、collections.deque等。

不可變序列:

tuple、str和bytes。

序列可不可變指的是序列的大小與其存儲的值可不可變。如元組,雖然不可變,但其可變對象元素是可變的,因元組里存儲的“值”是引用,即該元素指向哪個對象是不可變的,但指向的對象本身是允許改變的。

文章目錄

一、列表推導與生成器表達式

1.列表推導

2.生成器表達式

3.區別

二、元組

1.元組拆包

2.處理多余值

3.嵌套元組拆包

4.具名元組

三、切片

1.多維切片

2.切片賦值

四、對序列使用+和*

1.增量賦值

五、序列排序

一、列表推導與生成器表達式

列表推導用于便捷地構建列表,生成器表達式可用于構建任何類型的序列。

1.列表推導

基本形式:[ obj for x1 in iter1 for x2 in iter2 for .... ],其中obj為使用x1、x2、…表示的對象,可以為元組、字典或可調用對象等,iter1、iter2、…為可迭代對象,用于產出值。最終的結果為由obj對象實例構成的數組。

列表推導只用于生成列表,若要構建其他類型的序列,則需要使用生成器表達式。

2.生成器表達式

生成器表達式可用于構建任意類型的序列(將生成器表達式傳入對應的構造函數),生成器表達式的語法跟列表推導差不多,只不過將[]換為()。

dict((x,y) for x in range(3) for y in "ABC")

>> {1: 'C', 2: 'C', 3: 'C'}

且若生成器表達式為一個函數調用中的唯一參數,則不需要再額外使用括號。

3.區別

列表推導會一次性生成含有 n 個元素列表,受限于內存,列表推導存在內存不足的風險。

而生成器表達式只在每次for循環運行時才生成一個組合,省去運行時的內存開銷。故在初始化除列表之外的序列,使用生成器表達式能夠省去額外的內存占用。

句法提示:Python會忽略[]、{}、()中的換行,在其內可以省略續行符\。

二、元組

把元組用作記錄:元組其實是對數據的記錄,元組中元素的信息蘊含了一個字段的數據與該字段的位置。將元組當作字段的集合能夠充分利用元組的數量與位置信息。

如:

city,year,pop,chg,area = ("Tokyo",2003,32450,0.66,8014)

以上將元組用作一條數據的記錄,充分利用了元組的記錄數據與記錄位置功能。

1.元組拆包

應用:

平行賦值,將一個可迭代對象里的元素,一并賦值到由對應變量組成的元組;

字符串格式化時,一個占位符對應一個元組里的元素。

用例:

# 交換兩個變量的值

a,b = b,a

使用元組拆包可以將可迭代對象拆開作為函數的多個參數:

t = (2,3)

add(*t)

>> 5

也可以借助元組拆包從函數中返回多個值:

# func為返回長度為3的元組的函數

a,b,c = func()

2.處理多余值

元組拆包可以用于任何可迭代對象上,前提是平行賦值時對應的元素數量一致,除非用*來收集多余元素。其中*前綴只能用于一個變量名前,但是該變量可以出現在賦值表達式的任意位置。

a,b,*rest = (1,2,3,4,5,6,7)

# a=1, b=2, rest=[3,4,5,6,7]

a,*rest,b = (1,2,3,4,5,6,7)

# a=1, rest=[2,3,4,5,6], b=7

同時也可以使用占位符_(本質上也是一個變量)來處理拆包時不需要的數據。

3.嵌套元組拆包

接收表達式的元組可以是嵌套式的,只要這個接收元組的嵌套結構符合表達式的嵌套結構,Python 就可做出正確對應:

(a,(b,c),d)=(1,(2,3),4)

# a=1, b=2, c=3, d=4

4.具名元組

collections.namedtuple是一個工廠函數,其返回一個類并構建一個帶名字的元組:

from collections import namedtuple

City = namedtuple('city','name country population')

# 構建City類,該類的實例為一個名為city的元組,且元素中每個元素都有對應的名字

tokyo = City("Tokyo","JP","36,933")

tokyo

>> city("Tokyo","JP","36,933")

tokyo.country

>> "JP"

構建一個具名元組類需要兩個參數:一個是元組名,另一個是類的各個對應字段的名字。后者可以是數個字符串組成的可迭代對象,也可以是由空格分開的字段名組成的字符串。然后其返回一個類,該類用以構造具名元組。

獲取字段信息可以通過索引,也可以以屬性的形式通過字段名訪問。

具名元組獨有的屬性:

_fields類屬性:一個包含該類所有字段名稱的元組;

_make(iterable)類方法:接收可迭代對象生成類的實例,作用相當于City(*iterable);

_asdict()實例方法:將具名元組以collections.OrderdDict的形式返回。

namedtuple構建的類的實例所消耗的內存與元組一樣,因為字段名都被存在對應的類里(類屬性)。

三、切片

切片的基本形式:[a:b[:c]],表示在a和b之間以c為間隔取值,其中c可選,也可為負,若為負則表示反向取值。

而Python 中切片其實是一個slice切片對象的實例。類似[a:b:c]返回一個切片對象:slice(a,b,c)。

1.多維切片

[]里還可以使用逗號分開的索引或切片。要正確地處理這種關系,需要自定義特殊方法__geiitem__、__setitem__以元組的形式接收a[i,j]中的索引。即要得到a[i,j]的值,Python會調用a.__getitem__(i,j)。

a[i,j]!=a[i][j],即前者需要自定義特殊方法實現,后者是用來處理多維序列的。

多維索引與多維切片的做法主要是為了支持自定義拓展,標準庫中并沒有相關用法。

2.切片賦值

切片不止可以用于提取序列內容,對于可變序列,若將切片放在賦值語句左邊,或作為del的操作對象,就可以對序列進行就地修改操作。

示例:

l = list(range(10))

l[2:5] = [20,30]

l

>> [0,1,20,30,5,6,7,8,9]

del l[5:7]

l

>> [0,1,20,30,5,8,9]

如果賦值的對象是一個切片,則賦值語句的右側必須是個可迭代對象。即便是由單獨一個值,也要把它轉換成可迭代對象。

四、對序列使用+和*

對于序列可以使用+進行拼接、使用*進行重復,這兩個運算符是產生一個新的序列而不修改原有對象。

對a*n,若a含有對其他對象的引用,則需要特別注意,產生的結果中多個元素可能會共享引用。

1.增量賦值

增量賦值運算符+=與*=的表現取決于它們的第一個操作對象。 對于表達式a += b:

如果a實現了__iadd__(就地加法),則會調用這個方法;

若沒有__iadd__,則會調用__add__,此時表達式的效果等于a = a + b,首先運算a+b,再將結果賦值給a。

即表達式中變量名會不會被關聯到新對象取決于該類型有沒有實現__iadd__方法,對應到序列中就是可變序列與不可變序列。即對于內置序列類型而言,使用+=增量賦值雖然表現出來無差別,但實際上實現的方法不同。

同樣以上也適應于*=,但后者對應的是__imul__與__mul__。

對不可變序列進行重復增量拼接的話,效率會很低,因為每次都會產生新的對象,解釋器需要將原對象拷貝到新對象,再在新對象上進行追加操作。

五、序列排序

一般使用list.sort方法與內置函數sorted進行排序。這兩個方法都使用Timsort算法,該算法為穩定的算法。兩種的方法的區別為:

使用list.sort()方法對列表進行就地排序,返回None值,只能在列表示例上調用。

而使用內置函數sorted()會新建一個已排序列表作為返回值。這個方法可以接收任何形式的可迭代對象作參數,包括不可變對象和生成器;但不管接收何種參數,其始終返回一個列表。

而不管是list.sort()還是sorted(),都接收兩個參數:

reverse:若為True,則使用降序排序;默認為False;

key:一個只接收一個參數的函數,該函數會在序列的每個元素上調用,產生的結果作為排序算法比較的關鍵字。默認為恒等函數。

* 數組(array):

若我們需要一個只包含數字的列表,那么array.array將比list更高效,因為數組背后存的并不是float對象,而是數字的字節表述。數組支持所有可變序列有關的操作,還提供文件更快的I/O方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用EF Core在Blazor中創建級聯的DropDownList

介紹 (Introduction) In this article, we are going to create a cascading dropdown list in Blazor using Entity Framework Core database first approach. We will create two dropdown lists — Country and City. Upon selecting the value from the country dropdown, …

gcc/g++命令

參考:http://www.cnblogs.com/cryinstall/archive/2011/09/27/2280824.html 注意:gcc和g是linux系統下的編程常用指令,C語言文件用gcc,cpp文件用g。 1.預處理 g -E filename.cpp > filename.i 功能:輸出預處理后的…

計算機存儲

位(bit):一個數字0或一個數字1,代表一位 字節(Byte):每逢8位是一個字節,是數據存儲的最小單位 1Byte 8 bit 平時所說的網速: 100Mbps實際上是以位(b&#xf…

leetcode113. 路徑總和 II(dfs)

給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等于給定目標和的路徑。說明: 葉子節點是指沒有子節點的節點。示例: 給定如下二叉樹,以及目標和 sum 22,5/ \4 8/ / \11 13 4/ \ / \7 2 5 1 返回:[[5,4,11,…

java forward 修改請求參數_聊聊springboot session timeout參數設置

序本文主要介紹下spring boot中對session timeout參數值的設置過程。ServerPropertiesspring-boot-autoconfigure-1.5.8.RELEASE-sources.jar!/org/springframework/boot/autoconfigure/web/ServerProperties.javaOverridepublic void customize(ConfigurableEmbeddedServletCo…

javascript控制臺_如何使用JavaScript控制臺改善工作流程

javascript控制臺by Riccardo Canella里卡多卡內拉(Riccardo Canella) 如何使用JavaScript控制臺改善工作流程 (How you can improve your workflow using the JavaScript console) As a web developer, you know very well the need to debug your code. We often use extern…

appium===setup/setupclass的區別,以及@classmathod的使用方法

一、裝飾器 1.用setUp與setUpClass區別 setup():每個測試case運行前運行 teardown():每個測試case運行完后執行 setUpClass():必須使用classmethod 裝飾器,所有case運行前只運行一次 tearDownClass():必須使用classmethod裝飾器,所有case運行完后只運行一次 2.是修飾符&#xf…

cache failed module status_Flutter混編之路——iOS踩坑記錄

一、運行Xcode編譯或者flutter run/build 過程中報錯:"x86_64" is not an allowed value for option "ios-arch".解決方案在Debug.xcconfig中指定 “FLUTTER_BUILD_MODEdebug”,Release.xcconfig中指定“FLUTTER_BUILD_MODErelease”…

【最短路徑Floyd算法詳解推導過程】看完這篇,你還能不懂Floyd算法?還不會?...

簡介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特…

java object類的常用子類_Java中Object類常用的12個方法,你用過幾個?

前言Java 中的 Object 方法在面試中是一個非常高頻的點,畢竟 Object 是所有類的“老祖宗”。Java 中所有的類都有一個共同的祖先 Object 類,子類都會繼承所有 Object 類中的 public 方法。先看下 Object 的類結構(快捷鍵:alt7):1.…

leetcode面試題 04.12. 求和路徑(dfs)

給定一棵二叉樹,其中每個節點都含有一個整數數值(該值或正或負)。設計一個算法,打印節點數值總和等于某個給定值的所有路徑的數量。注意,路徑不一定非得從二叉樹的根節點或葉節點開始或結束,但是其方向必須向下(只能從父節點指向子…

javaweb學習總結(二十二)——基于Servlet+JSP+JavaBean開發模式的用戶登錄注冊

一、ServletJSPJavaBean開發模式(MVC)介紹 ServletJSPJavaBean模式(MVC)適合開發復雜的web應用,在這種模式下,servlet負責處理用戶請求,jsp負責數據顯示,javabean負責封裝數據。 ServletJSPJavaBean模式程序各個模塊之間層次清晰&…

2018黃河獎設計大賽獲獎_宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者

2018黃河獎設計大賽獲獎by Quincy Larson昆西拉爾森(Quincy Larson) 宣布我們的freeCodeCamp 2018杰出貢獻者獎獲獎者 (Announcing Our freeCodeCamp 2018 Top Contributor Award Winners) Over the past 3 years, freeCodeCamp.org has grown from a small open source proje…

Log4j配置詳解

來自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用來設置記錄器的級別、存放器和布局的,它可接keyvalue格式的設置或xml格式的設置信息。通過配置,可以創建出Log4J的運行環境。1. 配置文件 …

cors數據類型_如何根據RTK的差分格式選擇千尋cors賬號的源節點進行設置?

千尋cors賬號的設置中源節點是根據使用的品牌RTK是為雙星儀器還是三星儀器選擇,但問題就在于我們看到的RTK的技術參數中一般很少見到標注儀器的衛星系統,更多的是差分格式。其實千尋cors賬號的源節點也可以根據RTK的差分格式進行選擇,不過這兩…

java swing 串口_ComTest 接收串口數據,并顯示在文本框內,通過JavaSwing實現 Develop 265萬源代碼下載- www.pudn.com...

文件名稱: ComTest下載 收藏√ [5 4 3 2 1 ]開發工具: Java文件大小: 3157 KB上傳時間: 2016-09-21下載次數: 0提 供 者: 韓坤詳細說明:接收串口數據,并顯示在文本框內,通過JavaSwing實現-Receive serial data, and displayed in the t…

leetcode329. 矩陣中的最長遞增路徑(dfs)

給定一個整數矩陣,找出最長遞增路徑的長度。對于每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。示例 1:輸入: nums [[9,9,4],[6,6,8…

SQL大圣之路筆記——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 轉載于:https://www.cnblogs.com/allenzhang/p/6305564.html

用python繪制一條直線_python繪制直線的方法

本文實例為大家分享了python繪制直線的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下#!/usr/bin/env pythonimport vtk# 繪制通用方法def myshow(linepolydata):# Now well look at it.lineMapper vtk.vtkPolyDataMapper()if vtk.VTK_MAJOR_VERSION < 5:lineMap…

測試驅動開發 測試前移_我如何以及為什么認為測試驅動開發值得我花時間

測試驅動開發 測試前移by Ronauli Silva通過羅納利席爾瓦(Ronauli Silva) I first read about test driven development (TDD) in some technical reviews blog, but I barely read it (or thought about it). Why would people write tests first when they already knew the…