Python_基礎_函數

一.Python3函數
函數是組織好的,可重複使用,用來實現單一或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重複利用率。可以自己創建函數,這被叫做用戶自定義函數。
1.默認參數
在定義函數時 直接給定

def enroll(name,age,city='BeiJing'):
    print("name",name)
    print("age",age)
    print("city",city)

enroll("Tom",44)

這裏是個坑 默認函數也是一個變量 在函數定義出的時候就已經被定義出來了

def down(L=[]):
    L.append("END")
    return L
# L這個函數看似是給傳入的一個list添加元素
# print(down([1,2,3]))
print(down())  #['END']     函數返回的L是   ['END']
print(down())  #['END', 'END']    無參時 默認傳入L  然而L已經被定義 所以第二個返回的 L 是['END', 'END']
print(down())  #['END', 'END', 'END']  t同理

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L
# str 和 None 對象都是不可變對象 該內部數據結構不會變

2.可變參數

def add_n(*n): # 參數 n 接收的是一個tuple元組  (5),(8,9)
    sum = 0
    for s in n:
        sum = sum+s
    return sum
print(add_n(5,6,9))
# 當有一個List 或  tuple 時  可以直接傳入
LL = [9,6,8,43,21,8]
print(add_n(*LL))

3.關鍵字參數
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict

def person(name,age,**kr):
    print("name:",name,"age:",age,"other:",kr)
person("tony",88,city="BeiJing")

extra = {'city': 'Beijing', 'job': 'Engineer'} # 同理 可直接傳入dict
# **extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的**kr參數,kr將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kr的改動不會影響到函數外的extra
person('Jack',99,**extra)

4命名關鍵字參數
限制關鍵字參數的名字,就 用命名關鍵字參數;
和關鍵字參數*kw不同,命名關鍵字參數需要一個特殊分隔符,*後面的參數被視爲命名關鍵字參數。

def person_1(name,age,*,city,job): # 只接收 附加key w爲 city 和job 的 dict
    print(name,age,city,job)

5.參數組合

參數的順序必須是:必選參數,默認參數,可變參數,命名關鍵字參數和關鍵字參數。

def more(a,b,c='222',*d,**ee):
    print(a,b,c)
    sum = 0
    for i in d:
        sum=sum+i
    print(d)
    print(sum)
    print(ee)
more(1,2,"dddd",2,3,ee={'x':3})

6.變量作用域
Python中,程序的變量並不是在哪個位置都可以訪問的,訪問權限決定與這個變量是在哪裏賦值。
L (Local) 局部作用域
E (Enclosing) 閉包函數外的函數中
G (Global) 全局作用域
B (Built-in) 內建作用域
以L->E->G->B的順序查找:

m = 'girl'
def aa():
    m = 'boy'
    return m

print(aa()) # boy
print(m) #girl


b =100
def bb():
    b =200
    x = b +100
    return x

print(b) #
print(bb())# 300

def cc(): # 一個嵌套函數
    bar = 100
    def dd(): # 嵌套使用閉包作用域變量
        print(bar)
    dd()
    print(bar)

cc()#100
    #100
# 之前講過數字類型不允許改變,如果修改number數據類型的值將重新分配內存空間; 
def ee():
    bar = 100
    def ff():
        print(bar) # 編譯器報錯 不可變 此處不能重新定義
        bar = 200
        print(bar)
    ff()

def ee():
    bar = [100]
    def ff():
        print(bar) # 如果定義爲列表則不會報錯了
        bar[0] = 200
        print(bar)
    ff()
ee()#[100]
    #[200]

7.匿名函數
Python使用lambda關鍵字來創建匿名函數;
所謂的匿名函數即不再使用def()這樣的標準模式來創建一個函數了;
有以下幾點需要注意:
lambda表達式的函數體較def簡單得多,並不會包含太多邏輯;
lambda的匿名函數僅僅是一個表達式,並非一塊代碼塊,因此並不會包含太多邏輯;
lambda有自己的命名空間,故不可以訪問自己參數列表外的參數 及 全局命名空間裏的參數;
有興趣的可以去看一下java中的lambda表達式 在自身認識較淺的理解下個人任務Python 中lambda 可運用的功能比較淺;

a = lambda x,y:x*y   #生成x+y匿名函數
>>> a(2,5)
10
>>> b = lambda x,y =3,z =4:x+y+z  # 在lambda中定義默認函數
>>> b(4)
11
>>> b(5)
12
>>> b(3)
10
>>> b(3,z=7) # 注意多參數傳值時需指定參數名
13
>>> list(map(lambda x:x**3,[1,2,3,4]))# 使map生成序列 
[1, 8, 27, 64]
>>> list(map(lambda x,y:x+y,[11,22,33,44],[1,2,3,4]))# 多個參數傳值,如不匹配則以最少爲準
[12, 24, 36, 48]
>>> list(map(lambda x:x,range(10)))# 迭代器生成
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(map(lambda x:x*2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> l =[lambda x:x+2,lambda x:x*3,lambda x:x*5] # 生成一個可變列表
>>> l[0](0)
2
>>> l[0](100) #具體多大
102
>>> l[0](100000000000) # 
100000000002
>>> print(l[0](1),l[1](1),l[2](1))
3 3 5
>>> dict1 = {'k1':(lambda x:x**2),'k2':(lambda x:x**3),'k3':(lambda x:x**4)}
>>> print(dict1['k1'](2),dict1['k2'](2),dict1['k3'](2))  #生成可變字典
4 8 16

參考自:http://www.cnblogs.com/zhangxinqi/p/7616610.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章