1. 程式人生 > >python學習筆記第三天

python學習筆記第三天

for map 編程 www com wiki ont 通過 進入

  • 函數的參數
  • 局部變量和全局變量
  • 遞歸函數和匿名函數
  • 高階函數
  • 函數式編程了解

一、函數的各種參數

關鍵參數和位置參數:只要記住關鍵參數必須要放在位置參數後面就行了

#參數問題
def test(x,y,z):
    print(x)
    print(y)
    print(z)
test(z=1,x=2,y=3)#2,3,1,關鍵參數順序不受影響
test(1,2,3)#1,2,3,位置參數順序就是傳入的順序
#test(1,y=2,4)#error,關鍵參數必須放在位置參數的後面
test(1,z=2,y=2)

非固定參數(可變參數?):*args,**kwargs

#可變參數
def test1(*args):#形參的數量不固定
    print(args)
test1(1,2,3,4,5,)#實參放入元組中
#結合位置參數
def test2(x,*args):
    print(x)
    print(args)
test2(1,2,3,4,5,6,7)
#接受字典的可變參數---關鍵字參數
def test3(**kwargs):
    print(kwargs)
test3(name=‘sun‘,age=‘8‘,sex=‘M‘,tall="168")
test3(name=‘sun‘)
#組合使用
def test4(name,**kwargs):
    print(name)
    print(kwargs)
test4(‘sun‘)
test4(‘sun‘,age=10)
test4(‘sun‘,age=10,sex="m")

def test5(name,age=10,**kwargs):
    print(name)
    print(age)
    print(kwargs)
test5(‘sun‘,24,hobby=‘sleep‘)
test5(‘sun‘,sex=‘m‘,age=3)#age=3的位置可以放在後面

def test6(name,age=18,*args,**kwargs):
    print(name)
    print(age)
    print(args)
    print(kwargs)
test6(‘sun‘,24,1,2,3,sex=‘m‘,hobby=‘sleep‘)#註意以下*args是如何傳參的

二、局部變量和全局變量

針對數字、字符串這樣的變量,在函數內部的參數的改變不會影響函數外面的全局變量的值

#局部變量的問題
name=‘SYR‘
def change_name(name):
    print(‘before change‘,name)
    name=‘syr‘
    print(‘after change‘,name)
change_name(name)
print(name)

執行結果:

before change SYR
after change syr
SYR

如果執意要在函數內部改變函數外的同名全局變量,可以在函數內部申明global

school=‘CQPUT‘
def change(name):
    global school#在函數內就可以修改全局變量了
    school=‘cqput‘
    print(‘before change‘,name,school)
    name=‘syr‘
    print(‘after change‘,name)
change(name)
print(‘school‘,school)
#局部變量前面加上global之後,就可以修改全局變量

執行結果:

before change SYR cqput
after change syr
school cqput

可以看到shcool在內部改變了也會直接改變函數外面的那個school

但是針對數組,字典等,函數內部的參數改變會直接折射到函數外

#列表,集合,字典這些,在函數內部修改也會影響到全局變量
names=[‘sun‘,‘yue‘,‘ru‘]
def change_names():
    names[0]=‘孫‘
    print(names)
change_names()
print(names)#namse被修改 了

執行結果:

[‘孫‘, ‘yue‘, ‘ru‘]
[‘孫‘, ‘yue‘, ‘ru‘]

三、遞歸函數和匿名函數

遞歸函數的特性:

  1. 必須有一個明確的結束條件
  2. 每一次進入更深一次的遞歸,問題的規模都比上次減少
  3. 遞歸的效果很低,可能會導致棧溢出(函數的調用是通過棧實現)

簡單的遞歸示例:二分查找

#Author:Yueru Sun
def binary_search(dataset,find_num):
    print(dataset)
    if len(dataset)>1:
        mid=int(len(dataset)/2)
        if dataset[mid]==find_num:
            print(‘找到%d啦,在第%d位置‘%(dataset[mid],mid))
        elif dataset[mid]>find_num:
            print(‘要查找的數字在%d的左邊‘%dataset[mid])
            return binary_search(dataset[0:mid],find_num)
        else:
            print(‘要查找的數字在%d的右邊‘%dataset[mid])
            return binary_search(dataset[mid+1:],find_num)

    else:
        if dataset[0]==find_num:
            print(‘找到數字‘)
        else:
            print(‘查找失敗‘)
# data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
binary_search([1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35],1)

匿名函數:

就是不需要顯示的指定函數

簡單示例:

#這段代碼
def calc(n):
    return n**n
print(calc(10))
 
#換成匿名函數
calc = lambda n:n**n
print(calc(10))

結合map:

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

四、高階函數

高階函數就是一個函數接收另外一個函數作為參數。

簡單示例:

def add(x,y,f):
    return f(x) + f(y)
 
 
res = add(3,-6,abs)
print(res)

常用的高階函數之map:

>>> def f(x):
...     return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]

常用的高階函數之reduce:

>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

常用的高階函數之filter:

map()類似,filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素

def is_odd(n):
    return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 結果: [1, 5, 9, 15]

常用的高階函數之sorted:

sorted()函數也是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

  

五、函數式編程

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317848428125ae6aa24068b4c50a7e71501ab275d52000

python學習筆記第三天