python學習記錄-函式引數及名稱空間
今日內容概要
-
函式引數的兩大分類
-
位置引數和關鍵字引數
-
預設引數
-
可變長引數(重點)
-
名稱空間的概念
1. 形式引數 在函式定義階段從左往右依次寫入的變數名就叫形式引數,簡稱"形參" def func(a,b): pass # 這裡的a和b就是形式引數,形參 2. 實際引數 在函式呼叫階段從左往右依次寫入的變數值就叫實際引數,簡稱"實參" func(1, 2) # 這裡的1和2就是實際引數 ''' 形參和實參是什麼樣的關係 形參相當於變數名,實參相當於變數值 他們兩個在函式呼叫階段臨時繫結,函式執行結束立馬斷開聯絡 ''' # 形參的表現形式就一種 # 實參的表現形式有多種
位置引數
從左往右一次寫入的資料就是位置引數
位置形參
在定義函式的時候,從左往右依次寫入的變數名就是位置形參
位置實參
在函式調研階段,從左往右依次寫入的變數值就是位置實參
練習
寫一個可以比較兩個數字大小的函式,哪個大返回哪個值
'''
位置形參和位置實參的關係:
位置實參從左往右依次傳遞給位置實參(一一對應)
'''
關鍵字引數
my_max(b=1, a=2) # 關鍵字引數
通過形參名=變數值的形式傳遞
在函式定義階段的兩種情況
1.如果沒有定義給形參傳遞值,就使用預設的
2.如果給形參傳遞了值,就用提供的值
# 使用者註冊功能:
def register(name, age, gender='male'):
print('%s:%s:%s' % (name, age, gender))
如果gender=[]的時候
# 練習題2:
x = 100
def index(a, b, c=x):
print(a, b, c)
x = 200
index(1, 2)
'''
第一種解釋:
函式在定義階段,已經把值固定死了
第二種解釋:
變數名與變數值在記憶體中的關係判斷
可變長引數
1.無論在函式呼叫階段傳遞多少個位置實參都可以
def index(x, y, *a): 用(*形參)實現
print(x, y)
print(a)
'''
*在形參中的使用:
接收多餘的位置實參,把多餘的實參賦給*號後面的變數名,(元組形式)
'''
2.無論在函式呼叫階段傳遞多少個關鍵字實參都可以
def index(a, b, **x):
print(x)
'''
**號在形參中的使用:
接收多餘的關鍵字引數,把多餘的關鍵字引數賦給了**號後面的變數名,以字典的格式
'''
3.無論在函式呼叫階段傳遞多少個位置引數和關鍵字引數都可以
def index(u, z=100, *a, **b, ):
print(a)
print(b)
print(u)
# index()
index(1, 2, x=1, y=2)
'''
預設引數只要不放在**後面都可以
*號後面和**號後面的變數名可以任意命名
但是,在python中推薦使用
*args => arguments
**kwargs => keyword arguments
def func(a, b, c, *args, **kwargs):
pass
'''
*在實參中的應用
可以把元祖或者列表中的元素作為實參傳值給形參
**號在實參中使用
def func(username, password):
print(username, password)
d = {'username': 'jason', 'password': 222}
# func(d['x'], d['y'])
func(**d) # func(username='jason',password=222)
func(username='jason', password=222)
名稱空間的概念
1.什麼是名稱空間?
就是繫結變數名和變數值的地方
2.名稱空間的分類
(1)內建名稱空間
在python直譯器中
如:len(),print(),open()
(2)全域性空間
在py檔案中,頂格寫的都是全域性名稱空間
name='ly'
def (): #func函式名就在全居民稱空間中
a=[11,22,33]
for i in a: # i 也在全域性名稱空間中
print(i)
while True:
x=123 #也是
檢視全域性名稱空間
print(globais())
區域性名稱空間
在函式體中存在的都是區域性的
def index(a, b, c):
x = 222
y = 111
# 檢視區域性的名稱空間
print(locals())
index(1, 2, 3)
名字的查詢順序
查詢順序:
1.看自己的位置在哪裡:
如果是在區域性:區域性》全域性》內建
如果是在全域性:全域性》內建
區域性名稱空間的巢狀:
需要一層層呼叫
print(x)》666
def f1(): # x = 222 def f2(): # x = 333 def f3(): # x = 444 def f4(): # x = 555 def f5(): # x = 666 print(x) f5() f4() f3() f2() f1()