abs(-10) -->10
x = abs(-10) --> x = 10
y = abs --> #變數本身可以指向函式
z = abs z(-10) --> 10
abs = 10 abs(-10) --> 報錯
注:由於abs函式實際上是定義在import builtins模組中的,所以要讓修改abs變數的指向在其它模組也生效,要用import builtins; builtins.abs = 10。
如果乙個函式能夠接受另乙個函式作為引數,那個這個函式就稱為高階函式
eg: def add(x,y,f):
return f(x)+f(y)
x = -5
y = -2
f = abs # 注意:不能寫為 f = abs()
print(add(x,y,f)) --> 7
上述:add函式能夠接受abs函式作為引數,因此將add函式稱為高階函式
4.1:iterable & iteratoriterable 用來判斷是否可以迭代
iterator 用來判斷是否是迭代器
凡是可以for迴圈的 都是iterable
凡是可以next()的,都是iterator
集合資料型別:list、tuple、dict、set 都是iterable 不是 iterator,但可以通過iter()獲得乙個iterator物件
for迴圈的本質就是通過next()來獲取下乙個物件
list1 = [1,3,2,4]
for it in list1:
pass
上述for迴圈等價於以下**
it = iter(list1)
while true:
try:
x = next(it)
except stopiteration:
break
4.2:map函式map(f(s),iterable)函式接受兩個引數、第乙個引數為乙個函式,乙個是iterable
map將傳入的函式依次作用的序列的每個元素,並將結果作為新的iterator返回
eg:def f(x):
return x*x
list1 = [1,2,3,4,5]
r = map(f,list1) # r 是乙個iterator
print(list(r)) --> [1,4,9,16,25]
list(map(str,[1,2,3])) -->['1','2','3']
4.3:reduce函式
python3預設不會載入reduce函式,需要進行匯入:from functools import reduce
reduce(f(x),iterable) 要執行的函式必須接收兩個引數,這兩個引數進行運算,並將運算的結果再次和第三個元素進行運算,依次類推!
4.4: filter函式
filter 會讓列表中的每一元素都執行一次函式,並將執行函式返回為真或不為none的結果
eg:def test(s):
if s % 2 ==0:
return s
list3 = [4,23,6,7,8]
n = filter(test,list3)
print(list(n)) -->[4, 6, 8]
4.5:sorted排序函式1:預設從小到大排序
eg1:
list4 = [3,5,-2,8,6,-4]
print(sorted(list4)) --> [-4,-2,3,5,8,6]
list5 = ['zhangsan','lisi','wangwu']
print(sorted(list5)) -->['lisi', 'wangwu', 'zhangsan'] # 對字串排序遵從ascii碼順序
2:可用key函式來實現自定義排序
list4 = [3,5,-2,8,6,-4]
print(sorted(list4,key=abs)) --> [-2,3,-4,5,8,6]
list5 = ['zhangsan','lisi','wangwu']
print(sorted(list5,key=str.lower)) -->['lisi', 'wangwu', 'zhangsan']反向排序
3:可用reverse=true 進行反向排序
list4 = [3,5,-2,8,6,-4]ur
print(sorted(list4,key=abs,reverse=true --> [8, 6, 5, -4, 3, -2]
list5 = ['zhangsan','lisi','wangwu']
print(sorted(list5,key=str.lower)) -->['zhangsan', 'wangwu', 'lisi']
1:通常的求和函式
def wg_add(*args):
sum = 0
for i in args:
sum = sum +i
return sum
print(wg_add(1,3,5,6)) --> 15
2:若不需要立即求和,要在後面的**中根據需要計算可進行如下改寫
def wg_add1(*args):
def sum1():
sum = 0
for i in args:
sum = sum+i
return sum
return sum1 # return sum1()
f = wg_add1(1,2,3)
# 當我們呼叫 wg_add1函式時,返回的並不是求和結果,而是求和函式,當我們呼叫f時,才正真返回求和結果
print(f) -->.sum1 at 0x0000000002b1b840>
print(f()) -->6
閉包是指:
1:當乙個內函式使用了外函式的臨時變數
2:外函式的返回值是內函式的引用
eg1:
def outer(y):
x = 10
def inner():
# x = 2 # 當直接修改x的值是實際上是重新定義了乙個x物件、並未實質修改其外函式的臨時變數的值
nonlocal x # 若此處需要修改臨時變數x 的值,需要在此處申明nonlocal關鍵字
x=2return x+y # 內函式使用了外函式的臨時變數
return inner(),x # 外函式的返回值是內函式的引用
print(outer(20)) --> (22, 2)
eg2:
def wg_coun():
wg1 =
for i in range(1,4):
def wg_f():
return i*i
return wg1
w1,w2,w3 = wg_coun() # 並非立即執行
# 每次迴圈都建立了乙個函式,將建立的3個函式都返回
#當呼叫w1()是才會執行,此時,應用的變數i變為了3,所以最終結果為9
print(w1(),w2(),w3()) -->9,9,9
函式語法: lambda arg1,arg2:expression
print(list(map(lambda x:x*3,[1,2,3,4]))) --> [3, 6, 9, 12]
t = lambda :true
print(t()) --> true
t = lambda x,y:x+y
print(t(1,3)) --> 4
t = lambda x,y:x+y
# 用t(arg1,arg2)進行匿名函式呼叫
print(t(1,3)) --> 4
# lambda巢狀到普通函式中,lambda函式本身做為return的值
def wg2(n):
return lambda x:x+n
print(wg2(3)(4)) --> 7
python 裝飾器是用來拓展原來函式功能的一種函式,這種函式的特殊之處是它的返回值也是一種函式、使用python裝飾器的好處是在不用更改原函式**的前提下給函式增加新功能
1:一般而言,我們要拓展原函式,最直接的方式就是侵入到原函式**裡面進行修改
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...
函式式程式設計
維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...