函式式程式設計

2022-09-02 01:21:12 字數 4340 閱讀 3949

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 & iterator
iterable 用來判斷是否可以迭代

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 而且 演算的函式可以接受函式當...