1. 程式人生 > 其它 >python學習記錄-函式引數及名稱空間

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()