Python函數(shù)
1.函數(shù)定義
def 函數(shù)名(參數(shù)表列):
"""
函數(shù)文檔
(函數(shù)功能描述)
:param 參數(shù)名1:參數(shù)1描述
:param 參數(shù)名2:參數(shù)2描述
......
:return: 函數(shù)返回描述
"""
函數(shù)體
return 返回值
2.模塊調(diào)用
import 模塊名 as 新的模塊名
新的模塊名.方法名(參數(shù)表列)
3.函數(shù)參數(shù)
- 必須參數(shù)
必須以正確的順序傳入是尔,且調(diào)用時(shí)必須與生明時(shí)保持一致怠蹂。
def f(name, age):
print("I am %s, I am %d years old."%(name,age))
f('Eric', 18)
- 關(guān)鍵字參數(shù)
使用關(guān)鍵字參數(shù)允許參數(shù)調(diào)用時(shí)和聲明時(shí)順序不一致申屹。
f(age=18, name='Eric')
- 默認(rèn)參數(shù)
若參數(shù)缺省,則默認(rèn)值生效饱亮。
def f(name, age, sex = 'male'):
print("I am %s, I am %d years old." % (name, age))
print("Sex:%s"%sex)
f(name = 'lisi', age = 19)
f(name = 'zhangsan', age = 88, sex = 'female')
- 變長(zhǎng)(不定長(zhǎng))參數(shù)
傳入?yún)?shù)個(gè)數(shù)無(wú)限制吧凉。
形式參數(shù)以一個(gè)*號(hào)開(kāi)頭,代表一個(gè)任意長(zhǎng)度的元組(tuple)怎栽,可以接收連續(xù)一串參數(shù)丽猬。
形式參數(shù)以兩個(gè)*號(hào)開(kāi)頭,代表一個(gè)任意長(zhǎng)度的字典(dict)婚瓜,實(shí)際參數(shù)的形式是“key=value”(鍵值對(duì))宝鼓,可以接收連續(xù)的任意多個(gè)參數(shù)。
def 函數(shù)名(*args, **kwargs):
函數(shù)體
示例:
def self_print1(*args):
print(args)
print(type(args))
self_print1(1, 2, 3, 4, 5, 6, (1, 2))
def self_print2(**kwargs):
print(kwargs)
print(type(kwargs))
self_print2(last_name = 'zhang', first_name = 'san')
def self_print3(*args, **kwargs):
print(args)
print(kwargs)
self_print3('zhangsan', 'lisi', gender1 = '男', gender2 = '女')
實(shí)際參數(shù)以*開(kāi)頭巴刻,可將元組愚铡、列表、集合拆分為單個(gè)元素。
實(shí)際參數(shù)以**開(kāi)頭沥寥,可將字典拆分為單個(gè)鍵值對(duì)碍舍。
4.函數(shù)返回值
函數(shù)在執(zhí)行過(guò)程中只要遇到return語(yǔ)句,就會(huì)停止執(zhí)行并返回結(jié)果邑雅,所以也可以理解為 return 語(yǔ)句代表著函數(shù)的結(jié)束片橡。
如果未在函數(shù)中指定return,那這個(gè)函數(shù)的返回值為None。
Python可返回多個(gè)值淮野。如果return多個(gè)對(duì)象捧书,解釋器會(huì)把這多個(gè)對(duì)象組裝成一個(gè)元組作為一個(gè)一個(gè)整體結(jié)果輸出。
5.遞歸函數(shù)
遞歸函數(shù):直接或間接地調(diào)用自身的函數(shù)骤星。
示例:
# 階乘
def factorial(n):
if n == 1:
return 1
else:
return n*factorial1(n-1)
# 斐波那契數(shù)列
def fibonacci(n):
if n == 1 or n == 2:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
# 漢諾塔
def hanoi(i, A, B, C):
if i > 0:
hanoi(i - 1, A, C, B)
print(A, '->', C)
hanoi(i - 1, B, A, C)
6.高階函數(shù)
高階函數(shù):參數(shù)或返回值是函數(shù)的函數(shù)
示例:
絕對(duì)值求和
def add_abs(x, y, f):
return f(x) + f(y)
print(add_abs(3, -6, abs))
- 常用庫(kù)高階函數(shù)
1.map()
map(function, iterable)
該函數(shù)會(huì)把iterable中的數(shù)據(jù)依次傳遞給function函數(shù)處理经瓷,最后把結(jié)果返回。
示例:
def power(x):
return x**2
print(list(map(power, [1, 2, 3, 4, 5])))
print(list(map(lambda x: x**2, [1, 2, 3, 4, 5])))
2.reduce()
reduce(function, iterable)
reduce() 函數(shù)會(huì)對(duì)參數(shù)列表中的元素進(jìn)行累積洞难。
function函數(shù)必須為接收兩個(gè)參數(shù)的函數(shù)舆吮,reduce()會(huì)把function的運(yùn)行結(jié)果作為一個(gè)參數(shù),然后從iterable中再取出一個(gè)數(shù)據(jù)當(dāng)作另一個(gè)參數(shù)队贱。
3.filter()
filter(function, iterable)
filter() 函數(shù)會(huì)根據(jù)function來(lái)過(guò)濾iterable色冀。
具體做法是:將iterable中的數(shù)據(jù)依次傳入函數(shù)function中,如果函數(shù)返回True柱嫌,則保留該數(shù)據(jù)锋恬,反之則不保留。
4.sorted()
sorted(key=None, reverse=False)
sorted()函數(shù)會(huì)對(duì)iterable進(jìn)行非原地排序(不修改原對(duì)象)慎式。
通過(guò)參數(shù)key(參數(shù)key是一個(gè)函數(shù))來(lái)選取參與比較的元素伶氢。
7.匿名函數(shù)
- lambda表達(dá)式
lambda 形參列表: 函數(shù)返回值表達(dá)式語(yǔ)句
示例:
def cal(x, y):
if x > y:
return x*y
else:
return x/y
calc = lambda x, y:x*y if x > y else x/y
print("常規(guī)函數(shù)調(diào)用:",cal(5,4))
print("使用lambda:",calc(5,4))
print("常規(guī)函數(shù)調(diào)用:",cal(2,4))
print("使用lambda:",calc(2,4))
- 排序經(jīng)常使用lambda表達(dá)式
示例:
stus = [
{'name': 'zhangsan', 'age': 33},
{'name': 'lisi', 'age': 12},
{'name': 'wangwu', 'age': 53},
{'name': 'zhaoliu', 'age': 18},
{'name': 'tianqi', 'age': 77}
]
print('排序前:', stus)
# key值是按照哪個(gè)元素為依據(jù)進(jìn)行排序
res = sorted(stus, key=lambda item:item['age'])
print('根據(jù)年齡排序后:', res)
res = sorted(stus, key=lambda item:item['name'])
print('根據(jù)姓名排序后:', res)
8.內(nèi)置函數(shù)
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import__()
complex() hasattr() max() round()
delattr() hash() memoryview() set()
9.函數(shù)作用域
(1) 四種作用域
L:local,局部作用域瘪吏,即函數(shù)中定義的變量。
E:enclosing蜗巧,嵌套的父級(jí)函數(shù)的局部作用域掌眠,即包含此函數(shù)的上級(jí)函數(shù)的局部作用域,但不是全局的幕屹。
G:global蓝丙,全局變量,就是模塊級(jí)別定義的變量望拖。
B:built-in渺尘,系統(tǒng)固定模塊里面的變量,比如int, bytearray等说敏。
搜索變量的優(yōu)先級(jí)順序依次是:局部作用域>外層作用域>當(dāng)前模塊中的全局>python內(nèi)置作用域(LEGB)鸥跟。
注意:local和enclosing是相對(duì)的,enclosing變量相對(duì)上層來(lái)說(shuō)也是local。
(2) 作用域的產(chǎn)生
在Python中医咨,只有模塊(module)枫匾,類(class)以及函數(shù)(def、lambda)才會(huì)引入新的作用域拟淮,其它的代碼塊(如if干茉、try、for等)是不會(huì)引入新的作用域的很泊。
(3) 變量的跨域修改
對(duì)于一個(gè)變量角虫,內(nèi)部作用域先聲明就會(huì)覆蓋外部變量,不聲明直接使用委造,就會(huì)使用外部作用域的變量书聚。
當(dāng)修改的變量是在全局作用域(global作用域)上時(shí),需要使用global關(guān)鍵字先聲明西剥。
當(dāng)修改嵌套作用域(enclosing作用域音五,外層非全局作用域)中的變量時(shí),需要使用nonlocal關(guān)鍵字聲明亮垫。
10.用戶自定義函數(shù)特殊屬性
屬性 | 意義 | 讀寫性 |
---|---|---|
__doc__ | 該函數(shù)的文檔字符串模软,沒(méi)有則為 None;不會(huì)被子類繼承饮潦。 | 可寫 |
__name__ | 該函數(shù)的名稱燃异。 | 可寫 |
__qualname__ | 該函數(shù)的 qualified name。 | 可寫 |
__module__ | 該函數(shù)所屬模塊的名稱继蜡,沒(méi)有則為 None回俐。 | 可寫 |
__defaults__ | 由具有默認(rèn)值的參數(shù)的默認(rèn)參數(shù)值組成的元組,如無(wú)任何參數(shù)具有默認(rèn)值則為 None稀并。 | 可寫 |
__code__ | 表示編譯后的函數(shù)體的代碼對(duì)象仅颇。 | 可寫 |
__globals__ | 對(duì)存放該函數(shù)中全局變量的字典的引用 --- 函數(shù)所屬模塊的全局命名空間。 | 只讀 |
__dict__ | 命名空間支持的函數(shù)屬性碘举。 | 可寫 |
__closure__ | None 或包含該函數(shù)可用變量的綁定的單元的元組忘瓦。 | 只讀 |
__annotations__ | 包含參數(shù)標(biāo)注的字典。字典的鍵是參數(shù)名引颈,如存在返回標(biāo)注則為 'return'耕皮。 | 可寫 |
__kwdefaults__ | 僅包含關(guān)鍵字參數(shù)默認(rèn)值的字典。 | 可寫 |
- 查看函數(shù)文檔
print(函數(shù)名.__doc__)
help(函數(shù)名)