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)用時必須與生明時保持一致。
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)用時和聲明時順序不一致。
f(age=18, name='Eric')
- 默認參數(shù)
若參數(shù)缺省,則默認值生效。
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')

- 變長(不定長)參數(shù)
傳入?yún)?shù)個數(shù)無限制。
形式參數(shù)以一個*號開頭,代表一個任意長度的元組(tuple),可以接收連續(xù)一串參數(shù)。
形式參數(shù)以兩個*號開頭,代表一個任意長度的字典(dict),實際參數(shù)的形式是“key=value”(鍵值對),可以接收連續(xù)的任意多個參數(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ù)以**開頭,可將字典拆分為單個鍵值對。
4.函數(shù)返回值
函數(shù)在執(zhí)行過程中只要遇到return語句,就會停止執(zhí)行并返回結(jié)果,所以也可以理解為 return 語句代表著函數(shù)的結(jié)束。
如果未在函數(shù)中指定return,那這個函數(shù)的返回值為None。
Python可返回多個值。如果return多個對象,解釋器會把這多個對象組裝成一個元組作為一個一個整體結(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ù)
示例:
絕對值求和
def add_abs(x, y, f):
return f(x) + f(y)
print(add_abs(3, -6, abs))

- 常用庫高階函數(shù)
1.map()
map(function, iterable)
該函數(shù)會把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ù)會對參數(shù)列表中的元素進行累積。
function函數(shù)必須為接收兩個參數(shù)的函數(shù),reduce()會把function的運行結(jié)果作為一個參數(shù),然后從iterable中再取出一個數(shù)據(jù)當作另一個參數(shù)。

3.filter()
filter(function, iterable)
filter() 函數(shù)會根據(jù)function來過濾iterable。
具體做法是:將iterable中的數(shù)據(jù)依次傳入函數(shù)function中,如果函數(shù)返回True,則保留該數(shù)據(jù),反之則不保留。

4.sorted()
sorted(key=None, reverse=False)
sorted()函數(shù)會對iterable進行非原地排序(不修改原對象)。
通過參數(shù)key(參數(shù)key是一個函數(shù))來選取參與比較的元素。
7.匿名函數(shù)
- lambda表達式
lambda 形參列表: 函數(shù)返回值表達式語句
示例:
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表達式
示例:
stus = [
{'name': 'zhangsan', 'age': 33},
{'name': 'lisi', 'age': 12},
{'name': 'wangwu', 'age': 53},
{'name': 'zhaoliu', 'age': 18},
{'name': 'tianqi', 'age': 77}
]
print('排序前:', stus)
# key值是按照哪個元素為依據(jù)進行排序
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,嵌套的父級函數(shù)的局部作用域,即包含此函數(shù)的上級函數(shù)的局部作用域,但不是全局的。
G:global,全局變量,就是模塊級別定義的變量。
B:built-in,系統(tǒng)固定模塊里面的變量,比如int, bytearray等。
搜索變量的優(yōu)先級順序依次是:局部作用域>外層作用域>當前模塊中的全局>python內(nèi)置作用域(LEGB)。
注意:local和enclosing是相對的,enclosing變量相對上層來說也是local。
(2) 作用域的產(chǎn)生
在Python中,只有模塊(module),類(class)以及函數(shù)(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的。
(3) 變量的跨域修改
對于一個變量,內(nèi)部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量。
當修改的變量是在全局作用域(global作用域)上時,需要使用global關(guān)鍵字先聲明。
當修改嵌套作用域(enclosing作用域,外層非全局作用域)中的變量時,需要使用nonlocal關(guān)鍵字聲明。
10.用戶自定義函數(shù)特殊屬性
| 屬性 | 意義 | 讀寫性 |
|---|---|---|
| __doc__ | 該函數(shù)的文檔字符串,沒有則為 None;不會被子類繼承。 | 可寫 |
| __name__ | 該函數(shù)的名稱。 | 可寫 |
| __qualname__ | 該函數(shù)的 qualified name。 | 可寫 |
| __module__ | 該函數(shù)所屬模塊的名稱,沒有則為 None。 | 可寫 |
| __defaults__ | 由具有默認值的參數(shù)的默認參數(shù)值組成的元組,如無任何參數(shù)具有默認值則為 None。 | 可寫 |
| __code__ | 表示編譯后的函數(shù)體的代碼對象。 | 可寫 |
| __globals__ | 對存放該函數(shù)中全局變量的字典的引用 --- 函數(shù)所屬模塊的全局命名空間。 | 只讀 |
| __dict__ | 命名空間支持的函數(shù)屬性。 | 可寫 |
| __closure__ | None 或包含該函數(shù)可用變量的綁定的單元的元組。 | 只讀 |
| __annotations__ | 包含參數(shù)標注的字典。字典的鍵是參數(shù)名,如存在返回標注則為 'return'。 | 可寫 |
| __kwdefaults__ | 僅包含關(guān)鍵字參數(shù)默認值的字典。 | 可寫 |
- 查看函數(shù)文檔
print(函數(shù)名.__doc__)
help(函數(shù)名)