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

Python3 函數(shù)與數(shù)據(jù)結(jié)構(gòu) | 菜鳥教程(十一)

這篇具有很好參考價值的文章主要介紹了Python3 函數(shù)與數(shù)據(jù)結(jié)構(gòu) | 菜鳥教程(十一)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、Python3 函數(shù)

(一)定義一個函數(shù)

1、你可以定義一個由自己想要功能的函數(shù),以下是簡單的規(guī)則:

?2、語法

3、實例

①讓我們使用函數(shù)來輸出"Hello World!":

②更復(fù)雜點的應(yīng)用,函數(shù)中帶上參數(shù)變量:

Ⅰ實例:比較兩個數(shù),并返回較大的數(shù):

Ⅱ?qū)嵗河嬎忝娣e函數(shù):

(二)函數(shù)調(diào)用

1、定義一個函數(shù):給了函數(shù)一個名稱,指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)。

2、這個函數(shù)的基本結(jié)構(gòu)完成以后,你可以通過另一個函數(shù)調(diào)用執(zhí)行,也可以直接從 Python 命令提示符執(zhí)行。

3、如下實例調(diào)用了 printme() 函數(shù):

(三)參數(shù)傳遞

(四)可更改(mutable)與不可更改(immutable)對象

1、在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

?2、python 函數(shù)的參數(shù)傳遞:

3、python 傳不可變對象實例

4、傳可變對象實例

(五)參數(shù)

?1、必需參數(shù)

①必需參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時的數(shù)量必須和聲明時的一樣。

②調(diào)用 printme() 函數(shù),你必須傳入一個參數(shù),不然會出現(xiàn)語法錯誤:

2、關(guān)鍵字參數(shù)

①關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。

②使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與聲明時不一致,因為 Python 解釋器能夠用參數(shù)名匹配參數(shù)值。

③以下實例在函數(shù) printme() 調(diào)用時使用參數(shù)名:

④以下實例中演示了函數(shù)參數(shù)的使用不需要使用指定順序:

3、默認參數(shù)

4、不定長參數(shù)

①你可能需要一個函數(shù)能處理比當初聲明時更多的參數(shù)。這些參數(shù)叫做不定長參數(shù),和上述 2 種參數(shù)不同,聲明時不會命名。基本語法如下:

②加了星號 * 的參數(shù)會以元組(tuple)的形式導(dǎo)入,存放所有未命名的變量參數(shù)。

③如果在函數(shù)調(diào)用時沒有指定參數(shù),它就是一個空元組。我們也可以不向函數(shù)傳遞未命名的變量。

④還有一種就是參數(shù)帶兩個星號 **基本語法如下:

⑤加了兩個星號 ** 的參數(shù)會以字典的形式導(dǎo)入。

⑥聲明函數(shù)時,參數(shù)中星號 * 可以單獨出現(xiàn),例如:

⑦如果單獨出現(xiàn)星號 *,則星號 * 后的參數(shù)必須用關(guān)鍵字傳入:

(六)匿名函數(shù)

1、Python 使用 lambda 來創(chuàng)建匿名函數(shù)。

2、所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數(shù)。

3、語法

①lambda 函數(shù)的語法只包含一個語句,如下:

②設(shè)置參數(shù) a 加上 10:

③以下實例匿名函數(shù)設(shè)置兩個參數(shù):

④我們可以將匿名函數(shù)封裝在一個函數(shù)內(nèi),這樣可以使用同樣的代碼來創(chuàng)建多個匿名函數(shù)。

⑤以下實例將匿名函數(shù)封裝在 myfunc 函數(shù)中,通過傳入不同的參數(shù)來創(chuàng)建不同的匿名函數(shù):

(七)return 語句

(八)強制位置參數(shù)

1、Python3.8 新增了一個函數(shù)形參語法 / 用來指明函數(shù)形參必須使用指定位置參數(shù),不能使用關(guān)鍵字參數(shù)的形式。

2、在以下的例子中,形參 a 和 b 必須使用指定位置參數(shù),c 或 d 可以是位置形參或關(guān)鍵字形參,而 e 和 f 要求為關(guān)鍵字形參:

3、以下使用方法是正確的:

4、以下使用方法會發(fā)生錯誤:

二、Python3 數(shù)據(jù)結(jié)構(gòu)

(一)列表

1、ython中列表是可變的,這是它區(qū)別于字符串和元組的最重要的特點,一句話概括即:列表可以修改,而字符串和元組不能。

2、以下是 Python 中列表的方法:

3、下面示例演示了列表的大部分方法:

(二)將列表當做堆棧使用

1、列表方法使得列表可以很方便的作為一個堆棧來使用,堆棧作為特定的數(shù)據(jù)結(jié)構(gòu),最先進入的元素最后一個被釋放(后進先出)。

2、用 append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。

3、實例:

(三)將列表當作隊列使用

1、也可以把列表當做隊列用,只是在隊列里第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。

2、在列表的最后添加或者彈出元素速度快,然而在列表里插入或者從頭部彈出速度卻不快(因為所有其他的元素都得一個一個地移動)。

3、實例:

(四)列表推導(dǎo)式

1、列表推導(dǎo)式提供了從序列創(chuàng)建列表的簡單途徑。

2、通常應(yīng)用程序?qū)⒁恍┎僮鲬?yīng)用于某個序列的每個元素,用其獲得的結(jié)果作為生成新列表的元素,或者根據(jù)確定的判定條件創(chuàng)建子序列。

3、每個列表推導(dǎo)式都在 for 之后跟一個表達式,然后有零到多個 for 或 if 子句。返回結(jié)果是一個根據(jù)表達從其后的 for 和 if 上下文環(huán)境中生成出來的列表。如果希望表達式推導(dǎo)出一個元組,就必須使用括號。

4、這里我們將列表中每個數(shù)值乘三,獲得一個新的列表:

5、現(xiàn)在我們玩一點小花樣:

6、這里我們對序列里每一個元素逐個調(diào)用某方法:

7、我們可以用 if 子句作為過濾器:

8、以下是一些關(guān)于循環(huán)和其它技巧的演示:

9、列表推導(dǎo)式可以使用復(fù)雜表達式或嵌套函數(shù):

(五)嵌套列表解析

1、Python的列表還可以嵌套。

2、以下實例展示了3X4的矩陣列表:

3、以下實例將3X4的矩陣列表轉(zhuǎn)換為4X3列表:

4、以下實例也可以使用以下方法來實現(xiàn):

5、另外一種實現(xiàn)方法:

(六)del 語句

1、使用 del 語句可以從一個列表中根據(jù)索引來刪除一個元素,而不是值來刪除元素。這與使用 pop() 返回一個值不同??梢杂?del 語句從列表中刪除一個切割,或清空整個列表(我們以前介紹的方法是給該切割賦一個空列表)。

2、實例:

3、也可以用 del 刪除實體變量:

(七)元組和序列

(八)集合

1、集合是一個無序不重復(fù)元素的集。基本功能包括關(guān)系測試和消除重復(fù)元素。

2、可以用大括號({})創(chuàng)建集合。

3、注意:如果要創(chuàng)建一個空集合,你必須用 set() 而不是 {} ;后者創(chuàng)建一個空的字典,下一節(jié)我們會介紹這個數(shù)據(jù)結(jié)構(gòu)。

4、以下是一個簡單的演示:

5、集合也支持推導(dǎo)式:

(九)字典

1、另一個非常有用的 Python 內(nèi)建數(shù)據(jù)類型是字典。

2、序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以關(guān)鍵字為索引,關(guān)鍵字可以是任意不可變類型,通常用字符串或數(shù)值。

3、理解字典的最佳方式是把它看做無序的鍵=>值對集合。在同一個字典之內(nèi),關(guān)鍵字必須是互不相同。

4、一對大括號創(chuàng)建一個空的字典:{}。

5、這是一個字典運用的簡單例子:

6、構(gòu)造函數(shù) dict() 直接從鍵值對元組列表中構(gòu)建字典。如果有固定的模式,列表推導(dǎo)式指定特定的鍵值對:

7、此外,字典推導(dǎo)可以用來創(chuàng)建任意鍵和值的表達式詞典:

8、如果關(guān)鍵字只是簡單的字符串,使用關(guān)鍵字參數(shù)指定鍵值對有時候更方便:

(十)遍歷技巧

1、在字典中遍歷時,關(guān)鍵字和對應(yīng)的值可以使用 items() 方法同時解讀出來:

2、在序列中遍歷時,索引位置和對應(yīng)值可以使用 enumerate() 函數(shù)同時得到:

3、同時遍歷兩個或更多的序列,可以使用 zip() 組合:

4、要反向遍歷一個序列,首先指定這個序列,然后調(diào)用 reversed() 函數(shù):

5、要按順序遍歷一個序列,使用 sorted() 函數(shù)返回一個已排序的序列,并不修改原值:


一、Python3 函數(shù)

函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。

函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。

(一)定義一個函數(shù)

1、你可以定義一個由自己想要功能的函數(shù),以下是簡單的規(guī)則:

  • 函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函數(shù)標識符名稱和圓括號 ()
  • 任何傳入?yún)?shù)和自變量必須放在圓括號中間,圓括號之間可以用于定義參數(shù)。
  • 函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。
  • 函數(shù)內(nèi)容以冒號 : 起始,并且縮進。
  • return [表達式] 結(jié)束函數(shù),選擇性地返回一個值給調(diào)用方,不帶表達式的 return 相當于返回 None。

?Python3 函數(shù)與數(shù)據(jù)結(jié)構(gòu) | 菜鳥教程(十一)

?2、語法

Python 定義函數(shù)使用 def 關(guān)鍵字,一般格式如下:

def 函數(shù)名(參數(shù)列表):
    函數(shù)體

默認情況下,參數(shù)值和參數(shù)名稱是按函數(shù)聲明中定義的順序匹配起來的。

3、實例

①讓我們使用函數(shù)來輸出"Hello World!":

#!/usr/bin/python3

def hello() :
? ? print("Hello World!")

hello()

②更復(fù)雜點的應(yīng)用,函數(shù)中帶上參數(shù)變量:
Ⅰ實例:比較兩個數(shù),并返回較大的數(shù):

#!/usr/bin/python3

def max(a, b):

????????if a > b:

????????????????return a

????????else:

????????????????return b

a = 4

b = 5

print(max(a, b))

以上實例輸出結(jié)果:

5

Ⅱ?qū)嵗河嬎忝娣e函數(shù):

#!/usr/bin/python3

# 計算面積函數(shù)

def area(width, height):

????????return width * height

def print_welcome(name):

????????print("Welcome", name)

print_welcome("Runoob")

w = 4

h = 5

print("width =", w, " height =", h, " area =", area(w, h))

以上實例輸出結(jié)果:

Welcome Runoob
width = 4  height = 5  area = 20

(二)函數(shù)調(diào)用

1、定義一個函數(shù):給了函數(shù)一個名稱,指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)。

2、這個函數(shù)的基本結(jié)構(gòu)完成以后,你可以通過另一個函數(shù)調(diào)用執(zhí)行,也可以直接從 Python 命令提示符執(zhí)行。

3、如下實例調(diào)用了 printme() 函數(shù):

#!/usr/bin/python3

# 定義函數(shù)

def printme( str ):

????????# 打印任何傳入的字符串

????????print (str)

????????return

# 調(diào)用函數(shù)

printme("我要調(diào)用用戶自定義函數(shù)!")

printme("再次調(diào)用同一函數(shù)")

以上實例輸出結(jié)果:

我要調(diào)用用戶自定義函數(shù)!
再次調(diào)用同一函數(shù)

(三)參數(shù)傳遞

在 python 中,類型屬于對象,對象有不同類型的區(qū)分,變量是沒有類型的:

a=[1,2,3]

a="Runoob"

以上代碼中,[1,2,3] 是 List 類型,"Runoob" 是 String 類型,而變量 a 是沒有類型,她僅僅是一個對象的引用(一個指針),可以是指向 List 類型對象,也可以是指向 String 類型對象。

(四)可更改(mutable)與不可更改(immutable)對象

1、在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

  • 不可變類型:變量賦值 a=5 后再賦值 a=10,這里實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丟棄,不是改變 a 的值,相當于新生成了 a。

  • 可變類型:變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內(nèi)部的一部分值被修改了。

?2、python 函數(shù)的參數(shù)傳遞:

  • 不可變類型:類似 C++ 的值傳遞,如整數(shù)、字符串、元組。如 fun(a),傳遞的只是 a 的值,沒有影響 a 對象本身。如果在 fun(a) 內(nèi)部修改 a 的值,則是新生成一個 a 的對象。

  • 可變類型:類似 C++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過去,修改后 fun 外部的 la 也會受影響

?python 中一切都是對象,嚴格意義我們不能說值傳遞還是引用傳遞,我們應(yīng)該說傳不可變對象和傳可變對象。

3、python 傳不可變對象實例

通過 id() 函數(shù)來查看內(nèi)存地址變化:

def change(a):

????????print(id(a)) ????????????????# 指向的是同一個對象

????????a=10

????????print(id(a)) ????????????????# 一個新對象

a=1

print(id(a))

change(a)

以上實例輸出結(jié)果為:

4379369136
4379369136
4379369424

可以看見在調(diào)用函數(shù)前后,形參和實參指向的是同一個對象(對象 id 相同),在函數(shù)內(nèi)部修改形參后,形參指向的是不同的 id。

4、傳可變對象實例

可變對象在函數(shù)里修改了參數(shù),那么在調(diào)用這個函數(shù)的函數(shù)里,原始的參數(shù)也被改變了。例如:

#!/usr/bin/python3

# 可寫函數(shù)說明

def changeme( mylist ):

????????"修改傳入的列表"

????????mylist.append([1,2,3,4])

????????print ("函數(shù)內(nèi)取值: ", mylist)

????????return

# 調(diào)用changeme函數(shù)

mylist = [10,20,30]

changeme( mylist )

print ("函數(shù)外取值: ", mylist)

傳入函數(shù)的和在末尾添加新內(nèi)容的對象用的是同一個引用。故輸出結(jié)果如下:

函數(shù)內(nèi)取值:  [10, 20, 30, [1, 2, 3, 4]]
函數(shù)外取值:  [10, 20, 30, [1, 2, 3, 4]]

(五)參數(shù)

以下是調(diào)用函數(shù)時可使用的正式參數(shù)類型:

  • 必需參數(shù)
  • 關(guān)鍵字參數(shù)
  • 默認參數(shù)
  • 不定長參數(shù)

?1、必需參數(shù)

①必需參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時的數(shù)量必須和聲明時的一樣。
②調(diào)用 printme() 函數(shù),你必須傳入一個參數(shù),不然會出現(xiàn)語法錯誤:

實例:

#!/usr/bin/python3

#可寫函數(shù)說明

def printme( str ):

????????"打印任何傳入的字符串"

????????print (str)

????????return

# 調(diào)用 printme 函數(shù),不加參數(shù)會報錯

printme()

以上實例輸出結(jié)果:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    printme()
TypeError: printme() missing 1 required positional argument: 'str'

2、關(guān)鍵字參數(shù)

①關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。
②使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與聲明時不一致,因為 Python 解釋器能夠用參數(shù)名匹配參數(shù)值。
③以下實例在函數(shù) printme() 調(diào)用時使用參數(shù)名:

實例:

#!/usr/bin/python3

#可寫函數(shù)說明

def printme( str ):

????????"打印任何傳入的字符串"

????????print (str)

????????return

#調(diào)用printme函數(shù)

printme( str = "菜鳥教程")

以上實例輸出結(jié)果:

菜鳥教程
④以下實例中演示了函數(shù)參數(shù)的使用不需要使用指定順序:

#!/usr/bin/python3

#可寫函數(shù)說明

def printinfo( name, age ):

????????"打印任何傳入的字符串"

????????print ("名字: ", name)

????????print ("年齡: ", age)

????????return

#調(diào)用printinfo函數(shù)

printinfo( age=50, name="runoob" )

以上實例輸出結(jié)果:

名字:  runoob
年齡:  50

3、默認參數(shù)

調(diào)用函數(shù)時,如果沒有傳遞參數(shù),則會使用默認參數(shù)。以下實例中如果沒有傳入 age 參數(shù),則使用默認值:

實例:

#!/usr/bin/python3

#可寫函數(shù)說明

def printinfo( name, age = 35 ):

????????"打印任何傳入的字符串"

????????print ("名字: ", name)

????????print ("年齡: ", age)

????????return

#調(diào)用printinfo函數(shù)

printinfo( age=50, name="runoob" )

print ("------------------------")

printinfo( name="runoob" )

以上實例輸出結(jié)果:

名字:  runoob
年齡:  50
------------------------
名字:  runoob
年齡:  35

4、不定長參數(shù)

①你可能需要一個函數(shù)能處理比當初聲明時更多的參數(shù)。這些參數(shù)叫做不定長參數(shù),和上述 2 種參數(shù)不同,聲明時不會命名?;菊Z法如下:
def functionname([formal_args,] *var_args_tuple ):
   "函數(shù)_文檔字符串"
   function_suite
   return [expression]
②加了星號 * 的參數(shù)會以元組(tuple)的形式導(dǎo)入,存放所有未命名的變量參數(shù)。

實例:

#!/usr/bin/python3

# 可寫函數(shù)說明

def printinfo( arg1, *vartuple ):

????????"打印任何傳入的參數(shù)"

????????print ("輸出: ")

????????print (arg1)

????????print (vartuple)

# 調(diào)用printinfo 函數(shù)

printinfo( 70, 60, 50 )

以上實例輸出結(jié)果:

輸出: 
70
(60, 50)
③如果在函數(shù)調(diào)用時沒有指定參數(shù),它就是一個空元組。我們也可以不向函數(shù)傳遞未命名的變量。

如下實例:

#!/usr/bin/python3

# 可寫函數(shù)說明

def printinfo( arg1, *vartuple ):

????????"打印任何傳入的參數(shù)"

????????print ("輸出: ")

????????print (arg1)

????????for var in vartuple:

????????????????print (var)

????????return

# 調(diào)用printinfo 函數(shù)

printinfo( 10 )

printinfo( 70, 60, 50 )

以上實例輸出結(jié)果:

輸出:
10
輸出:
70
60
50
④還有一種就是參數(shù)帶兩個星號 **基本語法如下:
def functionname([formal_args,] **var_args_dict ):
   "函數(shù)_文檔字符串"
   function_suite
   return [expression]
⑤加了兩個星號 ** 的參數(shù)會以字典的形式導(dǎo)入。

實例:

#!/usr/bin/python3

# 可寫函數(shù)說明

def printinfo( arg1, **vardict ):

????????"打印任何傳入的參數(shù)"

????????print ("輸出: ")

????????print (arg1)

????????print (vardict)

# 調(diào)用printinfo 函數(shù)

printinfo(1, a=2,b=3)

以上實例輸出結(jié)果:

輸出: 
1
{'a': 2, 'b': 3}
⑥聲明函數(shù)時,參數(shù)中星號 * 可以單獨出現(xiàn),例如:
def f(a,b,*,c):
    return a+b+c
⑦如果單獨出現(xiàn)星號 *,則星號 * 后的參數(shù)必須用關(guān)鍵字傳入:
>>> def f(a,b,*,c):
...     return a+b+c
... 
>>> f(1,2,3)   # 報錯
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>

(六)匿名函數(shù)

1、Python 使用 lambda 來創(chuàng)建匿名函數(shù)。

2、所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數(shù)。

  • lambda 只是一個表達式,函數(shù)體比 def 簡單很多。
  • lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在 lambda 表達式中封裝有限的邏輯進去。
  • lambda 函數(shù)擁有自己的命名空間,且不能訪問自己參數(shù)列表之外或全局命名空間里的參數(shù)。
  • 雖然 lambda 函數(shù)看起來只能寫一行,卻不等同于 C 或 C++ 的內(nèi)聯(lián)函數(shù),后者的目的是調(diào)用小函數(shù)時不占用棧內(nèi)存從而增加運行效率。

3、語法

①lambda 函數(shù)的語法只包含一個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
②設(shè)置參數(shù) a 加上 10:

實例:

x = lambda a : a + 10

print(x(5))

以上實例輸出結(jié)果:

15

③以下實例匿名函數(shù)設(shè)置兩個參數(shù):

實例:

#!/usr/bin/python3

# 可寫函數(shù)說明

sum = lambda arg1, arg2: arg1 + arg2

# 調(diào)用sum函數(shù)

print ("相加后的值為 : ", sum( 10, 20 ))

print ("相加后的值為 : ", sum( 20, 20 ))

以上實例輸出結(jié)果:

相加后的值為 :  30
相加后的值為 :  40
④我們可以將匿名函數(shù)封裝在一個函數(shù)內(nèi),這樣可以使用同樣的代碼來創(chuàng)建多個匿名函數(shù)。
⑤以下實例將匿名函數(shù)封裝在 myfunc 函數(shù)中,通過傳入不同的參數(shù)來創(chuàng)建不同的匿名函數(shù):

實例:

def myfunc(n):

????????return lambda a : a * n

mydoubler = myfunc(2)

mytripler = myfunc(3)

print(mydoubler(11))

print(mytripler(11))

以上實例輸出結(jié)果:

22
33

(七)return 語句

return [表達式] 語句用于退出函數(shù),選擇性地向調(diào)用方返回一個表達式。不帶參數(shù)值的 return 語句返回 None。之前的例子都沒有示范如何返回數(shù)值,以下實例演示了 return 語句的用法:

實例:

#!/usr/bin/python3

# 可寫函數(shù)說明

def sum( arg1, arg2 ):

????????# 返回2個參數(shù)的和."

????????total = arg1 + arg2

????????print ("函數(shù)內(nèi) : ", total)

????????return total

# 調(diào)用sum函數(shù)

total = sum( 10, 20 )

print ("函數(shù)外 : ", total)

以上實例輸出結(jié)果:

函數(shù)內(nèi) :  30
函數(shù)外 :  30

(八)強制位置參數(shù)

1、Python3.8 新增了一個函數(shù)形參語法 / 用來指明函數(shù)形參必須使用指定位置參數(shù),不能使用關(guān)鍵字參數(shù)的形式。

2、在以下的例子中,形參 a 和 b 必須使用指定位置參數(shù),c 或 d 可以是位置形參或關(guān)鍵字形參,而 e 和 f 要求為關(guān)鍵字形參:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

3、以下使用方法是正確的:

f(10, 20, 30, d=40, e=50, f=60)

4、以下使用方法會發(fā)生錯誤:

f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用關(guān)鍵字參數(shù)的形式
f(10, 20, 30, 40, 50, f=60)           # e 必須使用關(guān)鍵字參數(shù)的形式

二、Python3 數(shù)據(jù)結(jié)構(gòu)

(一)列表

1、ython中列表是可變的,這是它區(qū)別于字符串和元組的最重要的特點,一句話概括即:列表可以修改,而字符串和元組不能。

2、以下是 Python 中列表的方法:

方法 描述
list.append(x) 把一個元素添加到列表的結(jié)尾,相當于 a[len(a):] = [x]。
list.extend(L) 通過添加指定列表的所有元素來擴充列表,相當于 a[len(a):] = L。
list.insert(i, x) 在指定位置插入一個元素。第一個參數(shù)是準備插入到其前面的那個元素的索引,例如 a.insert(0, x) 會插入到整個列表之前,而 a.insert(len(a), x) 相當于 a.append(x) 。
list.remove(x) 刪除列表中值為 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。
list.pop([i]) 從列表的指定位置移除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個元素。元素隨即從列表中被移除。(方法中 i 兩邊的方括號表示這個參數(shù)是可選的,而不是要求你輸入一對方括號,你會經(jīng)常在 Python 庫參考手冊中遇到這樣的標記。)
list.clear() 移除列表中的所有項,等于del a[:]。
list.index(x) 返回列表中第一個值為 x 的元素的索引。如果沒有匹配的元素就會返回一個錯誤。
list.count(x) 返回 x 在列表中出現(xiàn)的次數(shù)。
list.sort() 對列表中的元素進行排序。
list.reverse() 倒排列表中的元素。
list.copy() 返回列表的淺復(fù)制,等于a[:]。

3、下面示例演示了列表的大部分方法:

實例:

>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]

注意:類似 insert, remove 或 sort 等修改列表的方法沒有返回值。

(二)將列表當做堆棧使用

1、列表方法使得列表可以很方便的作為一個堆棧來使用,堆棧作為特定的數(shù)據(jù)結(jié)構(gòu),最先進入的元素最后一個被釋放(后進先出)。
2、用 append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。
3、實例:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

(三)將列表當作隊列使用

1、也可以把列表當做隊列用,只是在隊列里第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。

2、在列表的最后添加或者彈出元素速度快,然而在列表里插入或者從頭部彈出速度卻不快(因為所有其他的元素都得一個一個地移動)。

3、實例:

>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") ? ? ? ? ? ????????# Terry arrives
>>> queue.append("Graham") ? ? ? ? ???? # Graham arrives
>>> queue.popleft() ? ? ? ? ? ? ? ? ????????????? # The first to arrive now leaves
'Eric'
>>> queue.popleft() ? ? ? ? ? ? ? ? ???????? ????? # The second to arrive now leaves
'John'
>>> queue ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????? # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

(四)列表推導(dǎo)式

1、列表推導(dǎo)式提供了從序列創(chuàng)建列表的簡單途徑。

2、通常應(yīng)用程序?qū)⒁恍┎僮鲬?yīng)用于某個序列的每個元素,用其獲得的結(jié)果作為生成新列表的元素,或者根據(jù)確定的判定條件創(chuàng)建子序列。

3、每個列表推導(dǎo)式都在 for 之后跟一個表達式,然后有零到多個 for 或 if 子句。返回結(jié)果是一個根據(jù)表達從其后的 for 和 if 上下文環(huán)境中生成出來的列表。如果希望表達式推導(dǎo)出一個元組,就必須使用括號。

4、這里我們將列表中每個數(shù)值乘三,獲得一個新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

5、現(xiàn)在我們玩一點小花樣:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

6、這里我們對序列里每一個元素逐個調(diào)用某方法:

實例:

>>> freshfruit = [' ?banana', ' ?loganberry ', 'passion fruit ?']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

7、我們可以用 if 子句作為過濾器:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

8、以下是一些關(guān)于循環(huán)和其它技巧的演示:

>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]

9、列表推導(dǎo)式可以使用復(fù)雜表達式或嵌套函數(shù):

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

(五)嵌套列表解析

1、Python的列表還可以嵌套。

2、以下實例展示了3X4的矩陣列表:

>>> matrix = [
... ? ? [1, 2, 3, 4],
... ? ? [5, 6, 7, 8],
... ? ? [9, 10, 11, 12],
... ]

3、以下實例將3X4的矩陣列表轉(zhuǎn)換為4X3列表:

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

4、以下實例也可以使用以下方法來實現(xiàn):

>>> transposed = []
>>> for i in range(4):
... ? ? transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

5、另外一種實現(xiàn)方法:

>>> transposed = []
>>> for i in range(4):
... ? ? # the following 3 lines implement the nested listcomp
... ? ? transposed_row = []
... ? ? for row in matrix:
... ? ? ? ? transposed_row.append(row[i])
... ? ? transposed.append(transposed_row)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

(六)del 語句

1、使用 del 語句可以從一個列表中根據(jù)索引來刪除一個元素,而不是值來刪除元素。這與使用 pop() 返回一個值不同??梢杂?del 語句從列表中刪除一個切割,或清空整個列表(我們以前介紹的方法是給該切割賦一個空列表)。

2、實例:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]
>>> del a[0]
>>> a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]

3、也可以用 del 刪除實體變量:

>>> del a

(七)元組和序列

元組由若干逗號分隔的值組成,例如:

>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

如你所見,元組在輸出時總是有括號的,以便于正確表達嵌套結(jié)構(gòu)。在輸入時可能有或沒有括號, 不過括號通常是必須的(如果元組是更大的表達式的一部分)。

(八)集合

1、集合是一個無序不重復(fù)元素的集。基本功能包括關(guān)系測試和消除重復(fù)元素。

2、可以用大括號({})創(chuàng)建集合。

3、注意:如果要創(chuàng)建一個空集合,你必須用 set() 而不是 {} ;后者創(chuàng)建一個空的字典,下一節(jié)我們會介紹這個數(shù)據(jù)結(jié)構(gòu)。

4、以下是一個簡單的演示:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) ? ? ? ? ? ? ? ? ? ? ?# 刪除重復(fù)的
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket ? ? ? ? ? ? ? ? # 檢測成員
True
>>> 'crabgrass' in basket
False

>>> # 以下演示了兩個集合的操作
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# a 中唯一的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 在 a 中的字母,但不在 b 中
{'r', 'd', 'b'}
>>> a | b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 在 a 或 b 中的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 在 a 和 b 中都有的字母
{'a', 'c'}
>>> a ^ b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 在 a 或 b 中的字母,但不同時在 a 和 b 中
{'r', 'd', 'b', 'm', 'z', 'l'}

5、集合也支持推導(dǎo)式:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

(九)字典

1、另一個非常有用的 Python 內(nèi)建數(shù)據(jù)類型是字典。

2、序列是以連續(xù)的整數(shù)為索引,與此不同的是,字典以關(guān)鍵字為索引,關(guān)鍵字可以是任意不可變類型,通常用字符串或數(shù)值。

3、理解字典的最佳方式是把它看做無序的鍵=>值對集合。在同一個字典之內(nèi),關(guān)鍵字必須是互不相同。

4、一對大括號創(chuàng)建一個空的字典:{}。

5、這是一個字典運用的簡單例子:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False

6、構(gòu)造函數(shù) dict() 直接從鍵值對元組列表中構(gòu)建字典。如果有固定的模式,列表推導(dǎo)式指定特定的鍵值對:

>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}

7、此外,字典推導(dǎo)可以用來創(chuàng)建任意鍵和值的表達式詞典:

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

8、如果關(guān)鍵字只是簡單的字符串,使用關(guān)鍵字參數(shù)指定鍵值對有時候更方便:

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}

(十)遍歷技巧

1、在字典中遍歷時,關(guān)鍵字和對應(yīng)的值可以使用 items() 方法同時解讀出來:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... ? ? print(k, v)
...
gallahad the pure
robin the brave

2、在序列中遍歷時,索引位置和對應(yīng)值可以使用 enumerate() 函數(shù)同時得到:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... ? ? print(i, v)
...
0 tic
1 tac
2 toe

3、同時遍歷兩個或更多的序列,可以使用 zip() 組合:

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... ? ? print('What is your {0}? ?It is {1}.'.format(q, a))
...
What is your name? ?It is lancelot.
What is your quest? ?It is the holy grail.
What is your favorite color? ?It is blue.

4、要反向遍歷一個序列,首先指定這個序列,然后調(diào)用 reversed() 函數(shù):

>>> for i in reversed(range(1, 10, 2)):
... ? ? print(i)
...
9
7
5
3
1

5、要按順序遍歷一個序列,使用 sorted() 函數(shù)返回一個已排序的序列,并不修改原值:

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
>>> for f in sorted(set(basket)):
... ? ? print(f)
...
apple
banana
orange
pear文章來源地址http://www.zghlxwxcb.cn/news/detail-502577.html

到了這里,關(guān)于Python3 函數(shù)與數(shù)據(jù)結(jié)構(gòu) | 菜鳥教程(十一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • python3 0基礎(chǔ)學(xué)習(xí)----數(shù)據(jù)結(jié)構(gòu)(基礎(chǔ)+練習(xí))

    python3 0基礎(chǔ)學(xué)習(xí)----數(shù)據(jù)結(jié)構(gòu)(基礎(chǔ)+練習(xí))

    1. 定義 列表是一種有序的 可變序列 ,可以包含不同類型的元素。列表可以通過方括號 [] 來表示,元素之間用 逗號分隔 。 注釋: 注意列表可變,字符串不可變,只能改變大小寫 2. 實例: 3. 列表中常用方法 .append(要添加內(nèi)容) 向列表末尾添加數(shù)據(jù) .extend(列表) 將可迭代對象逐個

    2024年02月12日
    瀏覽(48)
  • Python 3 | 菜鳥教程 (一)

    Python 3 | 菜鳥教程 (一)

    目錄 一、Python3 簡介 二、Python 發(fā)展歷史 三、Python 特點 (一)易于學(xué)習(xí) (二)易于閱讀 (三)易于維護 (四)一個廣泛的標準庫 (五)互動模式 (六)可移植 (七)可擴展 (八)數(shù)據(jù)庫 (九)GUI編程 (十)可嵌入 四、Python 應(yīng)用 五、 Python3 環(huán)境搭建 六、Python3 下載 七

    2024年02月09日
    瀏覽(20)
  • 菜鳥教程《Python 3 教程》筆記(16):模塊

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 模塊 模塊 是一個包含所有你定義的函數(shù)和變量的文件,其后綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數(shù)等功能。 不管執(zhí)行了多少次 import,一個模塊只會被導(dǎo)入一次。 使用 import 語句的時候

    2024年02月09日
    瀏覽(23)
  • 菜鳥教程《Python 3 教程》筆記(8):字典

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 字典 8.1.1 fromkeys() 描述: fromkeys() 函數(shù)用于創(chuàng)建一個新字典,以序列 seq 中元素做字典的鍵,value 為字典所有鍵對應(yīng)的初始值。 語法: 參數(shù): seq – 字典鍵值列表; value – 可選參數(shù), 設(shè)置鍵序列(seq)對應(yīng)的

    2024年02月11日
    瀏覽(20)
  • 菜鳥教程 《Python 3 教程》筆記(4):數(shù)字

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 數(shù)字(Number) 數(shù)據(jù)類型是不允許改變的,這就意味著如果改變數(shù)字數(shù)據(jù)類型的值,將重新分配內(nèi)存空間。 注意: // 得到的并不一定是整數(shù)類型的數(shù),它與分母分子的數(shù)據(jù)類型有關(guān)系。 實例: 4.2.1 abs() 函數(shù) 描述:

    2024年02月11日
    瀏覽(19)
  • python菜鳥教程-矩陣對應(yīng)位置相加

    兩個 3 行 3 列的矩陣,實現(xiàn)其對應(yīng)位置的數(shù)據(jù)相加,并返回一個新矩陣: X = [[12,7,3], ????[4 ,5,6], ????[7 ,8,9]] Y = [[5,8,1], ????[6,7,3], ????[4,5,9]] 程序分析:創(chuàng)建一個新的 3 行 3 列的矩陣,使用 for 迭代并取出 X 和 Y 矩陣中對應(yīng)位置的值,相加后放到新矩陣的對應(yīng)位置中。

    2024年04月23日
    瀏覽(19)
  • 菜鳥教程《Python 3 教程》筆記(12):推導(dǎo)式

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 推導(dǎo)式 擴展閱讀: Python 中的列表推導(dǎo)式 參考 12.1 列表推導(dǎo)式,將 [] 替換為 {} 。 注意: 元組推導(dǎo)式返回的結(jié)果是一個生成器對象。

    2024年02月10日
    瀏覽(22)
  • 菜鳥教程《Python 3 教程》筆記(19):錯誤與異常

    菜鳥教程《Python 3 教程》筆記(19):錯誤與異常

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 錯誤和異常 Python 有兩種錯誤很容易辨認: 語法錯誤 和 異常 。 assert (斷言)用于判斷一個表達式,在表達式條件為 false 的時候觸發(fā)異常。斷言可以在條件不滿足程序運行的情況下直接返回錯誤,而不必等待

    2024年02月09日
    瀏覽(20)
  • Python教程_編程入門自學(xué)教程_菜鳥教程-免費教程分享

    Python - 教程 Python - 概述 Python - 環(huán)境設(shè)置 Python - 基本語法 Python - 變量類型 Python - 基本運算符 Python - 決策 Python - 循環(huán) Python - 數(shù)字 Python - 字符串 Python - 列表 Python - 元組 Python - 字典 Python - 日期和時間 Python - 功能 Python - 模塊 Python - 文件I / O. Python - 異常處理 Python - 面向?qū)ο?/p>

    2024年02月02日
    瀏覽(25)
  • 菜鳥教程《Python 3 教程》筆記 EX 01:命令行參數(shù)

    筆記帶有個人側(cè)重點,不追求面面俱到。 出處: 菜鳥教程 - Python3 命令行參數(shù) Python 中可以所用 sys 的 sys.argv 來獲取命令行參數(shù): 注意: sys.argv[0] 為腳本名。 實例: test.py 文件: 運行結(jié)果: getopt 模塊是專門處理命令行參數(shù)的模塊,用于獲取命令行選項和參數(shù)。該模塊提供

    2024年02月10日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包