函數進階

函數的動態參數(萬能參數)*args  **kwargs

  爲了擴展,對於傳入的實參數量不固定,而建立的   python

 *args 用法

  在函數定義的時候,*args 聚合,即將全部實參的位置參數聚合到一個元組上,並將這個元組賦值給args.app

def fuc1(a,*args):
    print(a)
    print(args)
fuc1(1,2,3,4,5,6,7)        #1      (2, 3, 4, 5, 6, 7)   
        

  在函數定義的時候,**kwargs 聚合成字典,即將實參全部的關鍵字參數聚合成一個字典的鍵值對函數

def func1(a,**kwargs):
    print(a)
    print(kwargs)
func1(a = "taibai",num = "alex",age = 18,sex = "")
#taibai
#{'num': 'alex', 'age': 18, 'sex': '男'}

  * 的魔性用法

 在函數定義時,在位置後表示聚合spa

 在函數執行時,在位置後表示打散(方便理解)code

l1 = [1,2,3]
l2 = [111,22,33,'alex']
def func1(*args):
    print(args)
func1(*l1,*l2)  #(1, 2, 3, 111, 22, 33, 'alex') 能夠理解爲先打散後再在函數內進行聚合成一個元組
#同理,**字典也能夠這樣打散後再聚合

 

形參位置優先級blog

  位置參數在最左邊,其後爲*args,其次爲默認參數,最後爲**kwargs,通常來講只存在一兩個進行運算,幾乎不存在四個全都在的狀況內存

名稱空間

咱們首先回憶一下Python代碼運行的時候遇到函數是怎麼作的,從Python解釋器開始執行以後,就在內存中開闢裏一個空間,每當遇到一個變量的時候,
就把變量名和值之間對應的關係記錄下來,可是當遇到函數定義的時候,解釋器只是象徵性的將函數名讀如內存,表示知道這個函數存在了,
至於函數內部的變量和邏輯,解釋器根本不關心。 等執行到函數調用的時候,Python解釋器會再開闢一塊內存來儲存這個函數裏面的內容,這個時候,才關注函數裏面有哪些變量,
而函數中的變量回儲存在新開闢出來的內存中,函數中的變量只能在函數內部使用,而且會隨着函數執行完畢,這塊內存中的全部內容也會被清空。 咱們給這個‘存放名字與值的關係’的空間起了一個名字
-------命名空間。 代碼在運行伊始,建立的存儲「變量名與值的關係」的空間叫作全局命名空間; 在函數的運行中開闢的臨時的空間叫作局部命名空間。

 

全局名稱空間:是一個存儲變量名和變量值對應地址的信息的一個容器

局部名稱空間:在函數運行中臨時開闢的空間。(臨時存在)

內置名稱空間:python中內部已經定義好的函數

做用域

全局做用域:包括全局名稱空間和內置名稱空間

局部做用域:局部名稱空間(臨時存在的,調用完成後就消失)

取值順序:就近原則,先從局部名稱空間找,再到全局名稱空間找,最後在到內置函數空間找作用域

加載順序:內置名稱空間---》全局名稱空間(當程序執行時)---》局部名稱空間(當函數調用時)class

函數的嵌套:一步一步看,不要粗心

   即在函數內部嵌套函數import

# x=1
# def f1():
#     def f2():
#         print(locals())
#         print(x)
#     print(locals())
#     return f2
# x=100
# def f3(func):
#     x=2
#     print(locals())
#     func()
# x=10000
# f3(f1())
# print(x)        #最後輸出結果爲10000

關鍵字:global    nonlocal

global

  1.聲明一個全局變量

  2.在局部做用域想要對全局做用域的全局變量進行修改時,須要用到global

  注意:對於可變的數據類型(list,dict,set)能夠直接引用而不須要經過global

l2 = [1,3,4]
dic ={"a":"b","c":"d"}
def func1():
    l2.append(6)
    dic["q"] = 3
    print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
    print(l2)    #[1, 3, 4, 6]
func1()
print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
print(l2)    #[1, 3, 4, 6]

 

nonlocal

  1.不能修改全局變量

  2.在局部做用域中,對父級做用域(或者更外層,非全局做用域)的變量進行引用和修改,而且用的哪層,從那成即如下此變量所有發生改變

# def func1():
#     b = 42
#     def func2():
#         nonlocal b
#         b += 10
#         print(b)            #b = 52
#         def func3():
#             nonlocal b
#             b += 20
#             print(b)        #b= 72
#         func3()
#     func2()
# func1()        

 函數的做用域鏈:

  小範圍做用域可使用大範圍的變量,可是反之不行,由於他是單項的

補充

在Python3將reduce函數放在functools 中了,

from functools import reduce
list1 = [1, 2, 3, 4]
def my_sum(x, y):
    return x + y
ret = reduce(my_sum, list1)#將列表中的一二個元素放入函數中,計算完,再放一個元素
print(ret)#輸出爲10
相關文章
相關標籤/搜索