函數 def fun(形參): 定義函數
fun(實參) 執行函數
return 函數的返回值,遇到return不執行下面的代碼,無return和直接寫return返回的是None,返回值有多個時會放到元組裏
'''
函數的註釋 標明函數的做用以及每一個值得意義 使用 函數名.__doc__ 便可查詢該函數得註釋值
''' 函數名 就是變量的功能加上()就能執行(也叫第一對象) 1、能夠相互賦值
def fun()
print('123qwe')
f = fun
f()
2、能夠當成函數的參數
def fun():
print('123')
def fun2(argc):
argc()
print('111')
fun2(fun)
3、能夠當成容器類數據的參數
def fun():
print('123')
def fun2():
print('111')
def fun3():
print('3333333')
list1 = [fun, fun2, fun3]
for i in list1:
i()
4、能夠當成函數的返回值
def fun():
print('123')
def fun2(argv):
print('111')
return argv #函數做爲返回值
f = fun2(fun) #將函數名做爲參數
f()
說明:此時的argv就是fun就是f f()實際上執行的是fun() 因此輸出爲:111 123
函數的傳參
從實參角度傳參順序: 位置參數=》關鍵字參數
def func1(x, y, z):
print(x, y, z)
func1(1, 2, 3) #位置參數 必須一一對應
func1(x=1, y=2, z=3) #關鍵字參數可不分順序
返回大數 三元運算符
def compare(a, b):
return a if a > b else b
或
print(a if a > b else b)
混合參數, 關鍵字參數必須在位置參數的後面。
def fun(argv1, argv2, argv3):
print(argv1)
print(argv2)
print(argv3)
fun(1, 2, argv3=3) #混合參數中位置參數一一對應,關鍵字參數必須在位置參數最後
從形參角度傳參順序: 位置參數=》*args=》默認參數=》**kwargs
1、位置參數 與實參角度同樣,必須一一對應,位置參數必須傳值
2、默認參數 默認參數必須在位置參數後面, 默認參數是個可變數據類型
當函數中有默認參數,那麼實參使用默認的,若是寫就覆蓋默認參數。使用方法爲sex = 'hhhh'(關鍵字傳參法)
def register(name, sex='男'):
with open('register.txt', encoding='utf-8',mode='a') as fd:
fd.write('{},{}\n'.format(name, sex))
while True:
print('q exit')
name = input('name=')
sex = input('sex=')
if name.upper() == 'Q':break
register(name) # 不傳實參時 形參會自動使用默認參數
--------------------------------、
def default_param(a, l = []) # 默認參數是可變數據類型
l.append(a)
print(l)
default_param('hello')
default_param('world')
動態參數:fun(*args, **kwargs)萬能參實
當函數的傳的參數不定時使用。*args接收的是位置參數,包括空值也不會報錯,並存放到元組。 **kwargs接收的是關鍵字參數,並存放到字典
def fun(*args, **kwargs):
print(args) #輸出類型爲元組(針對全部位置參數)
print(kwargs) #輸出字典
fun(1, 2, 3, 4, 5, 6, 7,'alex', '老男孩', a='w', b='q', c='323')
輸出:
(1, 2, 3, 4, 5, 6, 7, 'alex', '老男孩')
{'a': 'w', 'b': 'q', 'c': '323'}
打散、聚合功能,*將形參不管什麼格式以單個元素放入元組中。 **將形參聚合到字典中 (不會看這個)
def fun(*args, **kwargs): #形參加*表示將傳參聚合並放入一個元組中, 加**表示聚合到字典中
print(args)
print(kwargs)
list1 = [1, 2, 3, 4]
tupe1 = (1, 2, 3, 4)
list2 = ['alex', 'wuser', 4]
dic = {'qq':1, 'er':'wwe'}
fun(list1, *tupe1, *list2, cc = 4, **dic) #實參加 * 表示將位置參數迭代打散傳入,做用域爲 str tuple set list ** 表示將字典和關鍵字參數傳入
輸出:
([1, 2, 3, 4], 1, 2, 3, 4, 'alex', 'wuser', 4)
{'cc': 4, 'qq': 1, 'er': 'wwe'}
將dic 以*dic打散爲實參傳入 形參接受 到的是dic的key值
實參傳入的字典key不能使用純數字,由於傳入的參數是看成變量使用的
python的名稱空間
全局名命空間 臨時名稱空間 內置名稱空間
運行py代碼時,遇到一個變量時python會開闢一段空間,存的是 變量和值的指針的關係,如name與alix的id的關係,當print(name)時,會先找name而後再找對應關係,找到對應指針後重內存中找到alix並打印。
遇到函數時只是將函數的名字記錄到內存空間,其內部如何根本不關心,在函數調用時,python會開闢一段空間將記錄函數內部的變量和對應值指針的關係記錄,函數中的變量只能在函數內部使用,隨着函數結束這塊內存也會消失。
代碼的開始 建立的存儲‘變量與值的關係’的空間叫全局名命空間(全局名命空間);
在函數的運行中開闢的臨時的空間叫作局部名命空間(臨時名稱空間)
系統函數的是 內置名稱空間
加載順序 :內置名稱空間-》全局名稱空間-》局部名稱空間
取值順序: 局部名稱空間-》全局名稱空間-》內置名稱空間
做用域:
全局做用域:全局名稱空間 內置名稱空間
局部做用域:臨時名稱空間
關鍵字: 注意若是不調用該函數,即便使用了global和nonlocal修飾 也不會起做用
#global 在任何做用域 改變一個全局變量 ,如global 修飾的變量名不存在 至關於新建一個全局變量
name = 'hello'
def fun():
global name 使用關鍵字後,調用函數後name變爲全局變量
name = 'abc'
fun()
print(name)
輸出: abc
#nonlocal 不能修改全局變量;只能在局部做用域中使用nonlocal,只改變當前做用域的變量,如過當前找不到就會像上層函數找,若是每層都找不到會報錯。用的少 當py文件特別大時在嵌套過多時用
def fun():
name = '123'
print('qq%s'% name)
def fun2():
nonlocal name
name = 'abc'
print(name)
fun2()
print(name)
fun()
輸出:
qq123
abc
abc
-----------------
a = 1
def fun_1():
a = 2
def fun_2():
global a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a) 輸出:1 2 3 4 3 3 1