1. 程式人生 > >python 第四章 函數

python 第四章 函數

reduce 最好 函數傳遞 obj 什麽 __name__ type 內建函數 模塊

函數

函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。

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

定義一個函數

你可以定義一個由自己想要功能的函數,以下是簡單的規則:

  函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()

  任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。

  函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。

  函數內容以冒號起始,並且縮進。return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 def name():
5     print("xing")
6 
7 name()
8 #輸出
9 xing

給函數傳遞參數

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 def name(username):
5     print("x"+username)
6 
7 name("yx")
8 #輸出
9 xyx

實參和形參

在函數name()的定義中,變量username是一個形參——函數完成其工作所需的一項信息。在代碼name("yingxu")中,值"yingxu"是一個實參,實參是調用函數時傳遞

給函數的信息。我們調用函數時,將要讓函數使用的信息放在括號內。在name(username)中,將實參"yingxu",傳遞給了函數name(),這個值被儲存在username中

傳遞實參
位置參數
調用函數時,必須將函數調用中的每個實參都關聯到函數定義中的一個形參。為此
最簡單的關聯方式是基於實參的順序,這種關聯方式被稱為位置實參。
使用位置實參來調用函數時,如果實參的順序不正確,結果可能出乎意料

關鍵字實參
關鍵字實參是傳遞給函數的名稱—值對。你直接在實參中將名稱和值關聯起來了,
因此向函數傳遞實參時不會混淆。關鍵字實參讓你無需開率函數調用中的實參順序,還可以清楚的指出函數調用中各個值的用途
比如 name(username="值")

默認值
使用默認值時,在形參列表中必須先列出沒有默認值的形參,在列出有默認值的實參。這讓python依然能夠正確的解讀位置實參

避免實參錯誤
如果開始使用函數後,如果遇到實參不匹配錯誤,應該是提供的實參多於或者少於
函數完成其工作所需的信息,將出現實參不匹配的錯誤

位置實參和任意數量實參
如果要讓函數接受不同類型的實參,必須在函數定義中將接納任意數量實參的形參放在最後

global關鍵字 nonlocal關鍵字

整個模塊的變量都是全局變量 可用於整個模塊,可以在函數內部讀取他,最好不要在函數內修改他。如果真的要改 可以用 "global"關鍵字。修改嵌套作用域中的變量:如果在內部函數外部函數的局部變量就要使用nonlocal關鍵字了

使用global關鍵字修飾的變量之前可以並不存在,而使用nonlocal關鍵字修飾的變量在嵌套作用域中必須已經存在

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 x = 99
 5 def func():
 6     x = 88
 7 func()
 8 print(x) 
 9 #輸出99
10 
11 x = 99
12 def func()
13     global x
14     x = 88
15 func()
16 print(x)    
17 #輸出88
18 
19 def func():
20     count = 1
21     def foo():
22         count = 12
23     foo()
24     print(count)
25 func()
26 #輸出1
27 
28 def func():
29     count = 1
30     def foo():
31         nonlocal count
32         count = 12
33     foo()
34     print(count)
35 func()
36 #輸出12

lambda表達式 又叫匿名函數

python寫一些執行腳本時,使用lambda就可以省下定義函數過程,比如說我們只是需要寫個簡單的腳本來管理服務器時間,我們就不需要專門定義一個函數然後在寫調用,使用lambda就可以使的代碼更加精簡。
對於一些比較抽象並且整個程序執行下來只需要調用一兩次的函數,有時候給函數起個名字也是比較頭疼的問題,使用lambda就不需要考慮命名的問題了。
簡化代碼的可讀性。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 """lambda 格式"""
 5 #lambda 形參名:處理邏輯
 6 #v = lambda 形參名:處理邏輯  #賦值給一個變量
 7 #print(v(形參名的值))
 8 
 9 lambda x,y,z:(x+1,y+1,z+1)
10 v = lambda x,y,z:(x+1,y+1,z+1)
11 print(v(1,2,3))
12 #輸出
13 (2, 3, 4)
14 
15 lambda x:x+1
16 v = lambda x:x+1
17 print(v(10))
18 #輸出
19 11
20 
21 lambda name:name+"_sb"
22 v = lambda name:name+"_sb"
23 print(v("alex"))
24 #輸出
25 alex_sb

filter 函數(過濾器)

該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 v=list(filter(lambda x:x%2,range(10)))
5 print(v)
6 #輸出
7 [1, 3, 5, 7, 9]
8 """list(filter(函數邏輯處理,列表))  過濾後結果轉換成列表
9 不一定要是列表,只要是可叠代對象都可以"""

map() 函數(映射)

函數邏輯處理如果簡單可以用lamdba
否則自定義一個函數最好

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 a=list(map(lambda x : x * 2,range(10)))
5 print(a)
6 #輸出
7 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
8 """list(map(函數邏輯處理,列表)) 結果轉換成列表
9 不一定要是列表,只要是可叠代對象都可以。"""

reduce() 函數
對參數序列中元素進行累積

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from functools import reduce  #需要先在模塊中導入redece功能
 5 v=reduce(lambda x,y:x+y,[1,2,3,4,5,6],1)
 6 print(v)
 7 #輸出
 8 22
 9 """reduce(lambda 邏輯處理,列表,從什麽開始)1表示從什麽開始 這裏表示開頭x=1
10 必須是一個兩個參數的函數,不一定要是列表,只要是可叠代對象就可以"""

內置函數

abs(數字) 絕對值

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 >>> a = 8
5 >>> b = -8
6 >>> abs(a)
7 8
8 >>> abs(b)
9 8

round(浮點數) 四舍五入

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 >>>a = 4.5
5 >>>b = 4.6
6 >>>round(a)
7 4
8 >>>round(b)
9 5

pow(x,y,z) 表示次方 x**y & z 兩個參數表示次方 三個參數表示次方取余

#!/usr/bin/env python
# -*- coding:utf-8 -*-

>>> pow(2,3)
8
>>> pow(2,3,3)
2

divmod(x,y) 取商得余數,返回一個包含商和余數的元組(a // b, a % b)。

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 >>>divmod(7, 2)
5 (3, 1)
6 >>> divmod(8, 2)
7 (4, 0)

all() 函數用於判斷給定的可叠代參數 iterable 中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。註意:空元組、空列表返回值為True,這裏要特別註意。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>>all([a, b, c, d])  # 列表list,元素都不為空或0
 5 True
 6 >>> all([a, b, ‘‘, d])   # 列表list,存在一個為空的元素
 7 False
 8 >>> all([0, 1,2, 3])          # 列表list,存在一個為0的元素
 9 False
10    
11 >>> all((a, b, c, d))  # 元組tuple,元素都不為空或0
12 True
13 >>> all((a, b, ‘‘, d))   # 元組tuple,存在一個為空的元素
14 False
15 >>> all((0, 1, 2, 3))          # 元組tuple,存在一個為0的元素
16 False
17    
18 >>> all([])             # 空列表
19 True
20 >>> all(())             # 空元組
21 True

any()函數用於判斷給定的可叠代參數 iterable 是否全部為 False,則返回 False,如果有一個為 True,則返回 True。元素除了是 0、空、FALSE 外都算 True

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>>any([a, b, c, d])  # 列表list,元素都不為空或0
 5 True
 6  
 7 >>> any([a, b, ‘‘, d])   # 列表list,存在一個為空的元素
 8 True
 9  
10 >>> any([0, ‘‘, False])        # 列表list,元素全為0,‘‘,false
11 False
12  
13 >>> any((a, b, c, d))  # 元組tuple,元素都不為空或0
14 True
15  
16 >>> any((a, b, ‘‘, d))   # 元組tuple,存在一個為空的元素
17 True
18  
19 >>> any((0, ‘‘, False))        # 元組tuple,元素全為0,‘‘,false
20 False
21   
22 >>> any([]) # 空列表
23 False
24  
25 >>> any(()) # 空元組
26 False

bool() 函數用於將給定參數轉換為布爾類型,如果沒有參數,返回 False。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>>bool()
 5 False
 6 >>> bool(0)
 7 False
 8 >>> bool(1)
 9 True
10 >>> bool(2)
11 True

轉換進制函數

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>> a = 10
 5 >>> hex(a) #十進制轉十六進制
 6 0xa
 7 >>> oct(a) #十進制轉八進制
 8 0o12
 9 >>> bin(a) #十進制轉二進制
10 0b1010

轉換成ascii碼表中的數

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 >>> a = 78
5 >>> chr(a)  #把數字轉換成ascii碼表
6 N
7 >>> a = "N"
8 >>> ord(a)  #寫一個字符對應ascii碼表中的數
9 78

vars() 函數返回對象object的屬性和屬性值的字典對象

1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 
4 >>>print(vars())
5 {__builtins__: <module __builtin__ (built-in)>, __name__: __main__, __doc__: None, __package__: None}

dir(),type(),help()

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>> dir(help) #打印某一個對象下面都有哪些方法
 5 [__call__, __class__, __delattr__, __dict__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __init_subclass__, __le__, __lt__, __module__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __weakref__]
 6 
 7 >>> a = "a"
 8 >>> type(a)  #查看數據類型
 9 <class str>
10 
11 >>> help(dir)  #查看方法即解釋
12 Help on built-in function dir in module builtins:
13 
14 dir(...)
15     dir([object]) -> list of strings
16     
17     If called without an argument, return the names in the current scope.
18     Else, return an alphabetized list of names comprising (some of) the attributes
19     of the given object, and of attributes reachable from it.
20     If the object supplies a method named __dir__, it will be used; otherwise
21     the default dir() logic is used and returns:
22       for a module object: the modules attributes.
23       for a class object:  its attributes, and recursively the attributes
24         of its bases.
25       for any other object: its attributes, its classs attributes, and
26         recursively the attributes of its classs base classes.
27 
28 >>> 

enumerate() 可以吧一個list變成索引-元素對,這樣就可以在for循環中同時叠代索引和元素本身

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 for i,v in enumerate(range(10)):
 5     print(i,v)
 6 #輸出
 7 0 0
 8 1 1
 9 2 2
10 3 3
11 4 4
12 5 5
13 6 6
14 7 7
15 8 8
16 9 9

zip() 函數用於將可叠代的對象作為參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 >>> l1,l2,l3 = (1,2,3),(4,5,6),(7,8,9)
 5 >>> list(zip(l1,l2,l3))
 6 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
 7  
 8  
 9 >>> str1 = abc
10 >>> str2 = def123
11 >>> zip(str1,str2)
12 [(a, d), (b, e), (c, f)]
13 
14 #zip()方法用在for循環中,就會支持並行叠代:
15 
16 l1 = [2, 3, 4]
17 l2 = [4, 5, 6]
18 
19 for (x, y) in zip(l1, l2):
20     print(x, y, --, x * y)
21 #輸出 
22 2 4 -- 8
23 3 5 -- 15
24 4 6 -- 24

bytes() 把一個字符串轉換成字節的形式,需要先定義一個變量

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 name = "你好"
 5 print(bytes(name,encoding="utf-8"))
 6 print(bytes(name,encoding="utf-8").decode("utf-8"))
 7 #輸出
 8 b\xe4\xbd\xa0\xe5\xa5\xbd
 9 你好
10 
11 #encoding 編碼
12 #decode   解碼
13 #需要註意用什麽格式編碼就用什麽格式解碼 否則會報錯,python3默認"utf—8

python 第四章 函數