一、python 的四個作用域:
名稱 | 描述 |
---|---|
L | 局部作用域 |
E | 外部嵌套函數作用域 |
G | 全局作用域 |
B | 內建作用域 |
二、lambda 表達式(又名匿名函數表達式)
作用:
創建一個匿名函數對象
同def類似,但不提供函數名
語法:
lambda [形參1, 形參2, ...] : 表達式
語法說明
1. lambda 只是一個表達式,它用來創建一個函數對象
2. 當lambda表達式調用時,先執行冒號後的表達式,並返回表達式的結果的引用
3. lambda 表達式創建的函數只能包含一條表達式
4. lambda比函數簡單,且可以隨時創建和銷燬,有利於減少程序的偶合度
三、eval 和 exec 函數
3.1 eval函數:
作用:
把一個字符串當成一個表達式執行,返回表達式執行後的結果
格式:
eval(source(string), globals=None, locals=None)
print(eval("x+y", {'x':10, 'y':20})) # 30
print(eval("x+y", {'x':10, 'y':20}, {'x':1, 'y':2})) # 3
print(eval("x+y", {'x':10, 'y':20}, {'x':1})) # 21
先查找局部變量,沒有局部變量則向上一級找全部變量
3.2 exec函數:
作用:
把一個字符串當成程序來執行
格式:
exec(source(string), globals=None, local=None)
示例:
s = 'x=100; print("hello"); x += 1; print(x)'
print(s)
exec(s)
四、高階函數 High Order Function
什麼是高階函數:
滿足下列條件中的一個的函數即爲高階函數
1. 函數接受一個或多個函數作爲參數傳入
2. 函數返回一個函數
python內置(builtins)的高階函數:
map, filter, sorted
4.1 map 函數:
map(func, *iterables) 用函數對可迭代對象中的每一個元素作爲參數計算出新的可迭代對象,當最短的一個可迭代對象不再提供數據時,此可迭代對象生成結束
note: iterables前面有 *, 可以由多個可迭代參數對象
示例:
# 生成一個可迭代對象, 要求此可迭代對象生成
# 1**4, 2**3, 3**2, 4**1
# 1 8 9 4
for x in map(pow, [1,2,3,4], [4,3,2,1]):
print(x)
# 求 1**9 + 2**8 + 3**7 + ... 9**1的和
print(sum(map(pow, range(1, 10), range(9, 0, -1))))
# *iterables: range(1, 10), range(9, 0, -1)
4.2 filter函數
格式:
filter(func, iterable) (note: iterable前面沒有*, 表示只能有1個參數)
作用:
篩選可迭代對象iterable中的數據,返回一個可迭代對象,此可迭代對象將對iterable進行篩選
函數func 將對iterable中的每個元素進行求值,返回False時將此數據丟棄,返回True,則保留此數據
l = [x for x in filter(lambda x:x%2==0, range(10))]
print(l)
# []不能少
tarena@tedu:~/myy$ python3 isodd.py
[0, 2, 4, 6, 8]
4.3 sorted 函數:
作用:
將原可迭代對象的數據進行排序,生成排序後的列表
格式:
sorted(iterable, key=None, reverse=False)
參數說明:
參數 | 描述 |
---|---|
iterable | 可迭代對象 |
key | 綁定函數,此函數用來提供一個排序的依據 |
reverse | 標誌用來設置是否降序排序(從大到小), 默認是升序 |
input1:
names = ['Lyusdnik', 'Spike', 'Ann', 'Tykel']
name_sort = sorted(names, key=len, reverse=False)
print(name_sort)
output1:
['Ann', 'Spike', 'Tykel', 'Lyusdnik']
input2:
l = [5, -2, 3, -8, 1, 4]
print(sorted(l))
print(sorted(l, key=abs, reverse=False))
output2:
[-8, -2, 1, 3, 4, 5]
[1, -2, 3, 4, 5, -8]
input3:
def rev(s):
return s[::-1] # 逆序
name_rev = sorted(names, key=rev) # key 排序的依據
print(name_rev)
output3:
['Spike', 'Lyusdnik', 'Tykel', 'Ann']
五、遞歸函數
遞歸說明:
遞歸一定要控制遞歸的層數,當符合某一條件時要終止遞歸
幾乎所有的遞歸都能用循環來代替
遞歸的優缺點:
優點:
遞歸可以把問題簡單化,讓路徑更爲清晰,代碼更爲簡潔
缺點:
遞歸因系統環境影響大,當遞歸深度太大時,可以會得到不可預知的結果
遞歸實現的方法:先假設函數已經實現
def myfac(x):
if x == 1: # 設置終止迭代條件
return 1
return x * myfac(x - 1)
print(myfac(5))
# 遞歸實現斐波那契數列
def fab(n):
# 遞歸調用必須有一個出口即返回值
if n == 0 or n == 1:
return 1
# 遞歸:函數的自身調用,變量必須有變化
return fab(n-1) +fab(n-2)
print(fab(10))