日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记之函数式编程

發布時間:2025/3/14 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记之函数式编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python中的高階函數

高階函數就是 變量名指向函數,下面代碼中的變量abs其實是一個函數,返回數字的絕對值,如abs(-10) 返回 10

def add(x,y,f):return f(x) +f(y) add(-5,9,abs)#14

python把函數作為參數

利用add(x,y,f)函數計算:

import math def add(x, y, f):return f(x) + f(y) print add(25, 9, math.sqrt) #5,3

python中map()函數

map()是 Python 內置的高階函數,它接收一個函數 f?和一個?list,并通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 并返回。

例如,對于list [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果希望把list的每個元素都作平方,就可以用map()函數:

因此,我們只需要傳入函數f(x)=x*x,就可以利用map()函數完成這個計算:

def f(x):return x*x print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

輸出結果:

[1, 4, 9, 10, 25, 36, 49, 64, 81]

注意:map()函數不改變原有的 list,而是返回一個新的 list。
例如:假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則,請利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字的list:

#小寫轉大寫 def format_name(s):return s.title() print map(format_name, ['adam', 'LISA', 'barT']) #['Adam', 'Lisa', 'Bart']

python中reduce()函數

from functools import reduce # Python3.X中需要引入包

reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,并返回最終結果值。
例如,編寫一個f函數,接收x和y,返回x和y的和:

def f(x, y):return x + y

調用?reduce(f, [1, 3, 5, 7, 9])時,reduce函數將做如下計算:

先計算頭兩個元素:f(1, 3),結果為4; 再把結果和第3個元素計算:f(4, 5),結果為9; 再把結果和第4個元素計算:f(9, 7),結果為16; 再把結果和第5個元素計算:f(16, 9),結果為25; 由于沒有更多的元素了,計算結束,返回結果25。

上述計算實際上是對 list 的所有元素求和。雖然Python內置了求和函數sum(),但是,利用reduce()求和也很簡單。
reduce()還可以接收第3個可選參數,作為計算的初始值。如果把初始值設為100,計算:

reduce(f, [1, 3, 5, 7, 9], 100)

結果將變為125,因為第一輪計算是:
計算初始值和第一個元素:f(100, 1),結果為101。
例如:
Python內置了求和函數sum(),但沒有求積的函數,請利用recude()來求積:
輸入:[2, 4, 5, 7, 12]

輸出:2*4*5*7*12的結果

def prod(x, y):return x*yprint reduce(prod, [2, 4, 5, 7, 12])

python中filter()函數

filter()函數是?Python?內置的另一個有用的高階函數,filter()函數接收一個函數 f?和一個list,這個函數?f?的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函數:

def is_odd(x):return x % 2 == 1

然后,利用filter()過濾掉偶數:

filter(is_odd, [1, 4, 6, 7, 9, 12, 17]) py3 中還要加list,.....print(list( filter(is_sqr, range(1, 101)))

?

結果:[1, 7, 9, 17]

利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字符串:

def is_not_empty(s):return s and len(s.strip()) > 0 filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])#['test', 'str', 'END']#Python 3.X 中 print(list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])))

?

注意:?s.strip(rm) 刪除 s 字符串中開頭、結尾處的 rm 序列的字符。

當rm為空時,默認刪除空白符(包括'\n', '\r', '\t', ' '),如下:

a = ' 123' a.strip() #結果: '123' a='\t\t123\r\n' a.strip() #結果:'123'

請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

import mathdef is_sqr(x):r = int(math.sqrt(x))return r*r==xprint filter(is_sqr, range(1, 101))
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] #python 3.X print(list(filter(is_sqr, range(1, 101))))
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

?

python中自定義排序函數

Python內置的?sorted()函數可對list進行排序:

>>>sorted([36, 5, 12, 9, 21])#[5, 9, 12, 21, 36]

但?sorted()也是一個高階函數,它可以接收一個比較函數來實現自定義排序,比較函數的定義是,傳入兩個待比較的元素 x, y,如果 x 應該排在 y 的前面,返回 -1,如果 x 應該排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。

因此,如果我們要實現倒序排序,只需要編寫一個reversed_cmp函數:

def reversed_cmp(x, y):if x > y:return -1if x < y:return 1return 0

這樣,調用 sorted() 并傳入 reversed_cmp 就可以實現倒序排序:

>>> sorted([36, 5, 12, 9, 21], reversed_cmp) #[36, 21, 12, 9, 5]

sorted()也可以對字符串進行排序,字符串默認按照ASCII大小來比較:

>>> sorted(['bob', 'about', 'Zoo', 'Credit']) ['Credit', 'Zoo', 'about', 'bob']

'Zoo'排在'about'之前是因為'Z'的ASCII碼比'a'小。
例如:

對字符串排序時,有時候忽略大小寫排序更符合習慣。請利用sorted()高階函數,實現忽略大小寫排序的算法。

輸入:['bob', 'about', 'Zoo', 'Credit']
輸出:['about', 'bob', 'Credit', 'Zoo']

def cmp_ignore_case(s1, s2):u1 = s1.upper()u2 = s2.upper()if u1 > u2:return 1if u1 < u2:return -1return 0 print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case) #python 3.X 中自定義排序函數 sorted()a = ['bob', 'about', 'Zoo', 'Credit']print(sorted(a, key=str.lower))l = [36, 5, 12, 9, 21]print(sorted(l, key=lambda x:(x<0,abs(x))))

?

python中返回函數

Python的函數不但可以返回int、str、list、dict等數據類型,還可以返回函數!

例如,定義一個函數 f(),我們讓它返回一個函數 g,可以這樣寫:

def f():print 'call f()...'# 定義函數g:def g():print 'call g()...'# 返回函數g:return g

?

仔細觀察上面的函數定義,我們在函數 f 內部又定義了一個函數 g。由于函數 g 也是一個對象,函數名 g 就是指向函數 g 的變量,所以,最外層函數 f 可以返回變量 g,也就是函數 g 本身。

調用函數 f,我們會得到 f 返回的一個函數:

>>> x = f() # 調用f() call f()... >>> x # 變量x是f()返回的函數: <function g at 0x1037bf320> >>> x() # x指向函數,因此可以調用 call g()... # 調用x()就是執行g()函數定義的代碼

請注意區分返回函數和返回值:

def myabs():return abs # 返回函數 def myabs2(x):return abs(x) # 返回函數調用的結果,返回值是一個數值

返回函數可以把一些計算延遲執行。例如,如果定義一個普通的求和函數:

def calc_sum(lst):return sum(lst)

調用calc_sum()函數時,將立刻計算并得到結果:

>>> calc_sum([1, 2, 3, 4]) 10

?

但是,如果返回一個函數,就可以“延遲計算”:

def calc_sum(lst):def lazy_sum():return sum(lst)return lazy_sum

?

# 調用calc_sum()并沒有計算出結果,而是返回函數:

>>> f = calc_sum([1, 2, 3, 4]) >>> f <function lazy_sum at 0x1037bfaa0>

?

# 對返回的函數進行調用時,才計算出結果:

>>> f() 10

?

由于可以返回函數,我們在后續代碼里就可以決定到底要不要調用該函數。

例如:

請編寫一個函數calc_prod(lst),它接收一個list,返回一個函數,返回函數可以計算參數的乘積。

def calc_prod(lst):def lazy_prod():def f(x,y):return x*yreturn reduce(f, lst, 1)return lazy_prod f = calc_prod([1, 2, 3, 4]) print f()

python中閉包

在函數內部定義的函數和外部定義的函數是一樣的,只是他們無法被外部訪問:

def g():print 'g()...'def f():print 'f()...'return g

將?g?的定義移入函數?f?內部,防止其他代碼調用?g:

def f():print 'f()...'def g():print 'g()...'return g

但是,考察上一小節定義的?calc_sum?函數:

def calc_sum(lst):def lazy_sum():return sum(lst)return lazy_sum

注意:?發現沒法把?lazy_sum?移到?calc_sum?的外部,因為它引用了?calc_sum?的參數?lst。

像這種內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。

閉包的特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變。
例如:
返回閉包不能引用循環變量,請改寫count()函數,讓它正確返回能計算1x1、2x2、3x3的函數。

def count():fs = []for i in range(1, 4):def f(j):def g():return j*jreturn gr = f(i)fs.append(r)return fsf1, f2, f3 = count() print f1(), f2(), f3()

python中匿名函數 ?lambda函數

高階函數可以接收函數做參數,有些時候,我們不需要顯式地定義函數,直接傳入匿名函數更方便。

在Python中,對匿名函數提供了有限支持。還是以map()函數為例,計算 f(x)=x2?時,除了定義一個f(x)的函數外,還可以直接傳入匿名函數:

#Function 正常使用的表達方法 def func(n):return n + 1 print(func(2))#Lambda 表達方法 f = lambda x:x+1 print(f) print(f(2))>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]#Python 3.X中是: print(list(map(lambda x: x * x, [1,2,3,4,5,6,7,8,9]))) #[1, 4, 9, 16, 25, 36, 49, 64, 81]

?

?

當然Lambda表達式也有以下的使用情況:

#多參數情況 print("多參數情況") multi = lambda x,y,z: x+y+z print(multi(1,2,3))#和非匿名函數一塊工作 print("和非匿名函數一塊工作")def namedFunc(n):return lambda x:n+xprint(namedFunc(2)) #會打印出function,相當于 lambda x: 2+x print(namedFunc(2)(3)) #會打印出5 f = namedFunc(2) print(f(3)) #等同于namedFunc(2)(3)

?

?

通過對比可以看出,匿名函數?lambda x: x * x?實際上就是:

def f(x):return x * x

關鍵字lambda?表示匿名函數,冒號前面的?x 表示函數參數。

匿名函數有個限制,就是只能有一個表達式,不寫return,返回值就是該表達式的結果。

例如:

print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])#Python3.x 中是這樣的: print(list(filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])))

對于lambda表達式在Python程序中的一些小建議

1. 對于簡單的邏輯處理,可以放心使用Lambda表達式,這樣比較簡潔

2. 對于復雜的邏輯處理,盡量避免使用Lambda表達式,易讀性差,而且容易出錯(大牛除外)

python 中 decortor 裝飾器

python中編寫無參數decorator

Python的?decorator?本質上就是一個高階函數,它接收一個函數作為參數,然后,返回一個新函數。

使用 decorator 用Python提供的?@?語法,這樣可以避免手動編寫f = decorate(f)?這樣的代碼。

考察一個@log的定義:

def log(f):def fn(x):print 'call ' + f.__name__ + '()...'return f(x)return fn

?

對于階乘函數,@log工作得很好:

@log def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)

?

結果:

call factorial()... 3628800

?

但是,對于參數不是一個的函數,調用將報錯:

@log def add(x, y):return x + y print add(1, 2) #結果: Traceback (most recent call last):File "test.py", line 15, in <module>print add(1,2) TypeError: fn() takes exactly 1 argument (2 given)

?

因為?add()?函數需要傳入兩個參數,但是?@log?寫死了只含一個參數的返回函數。

要讓?@log?自適應任何參數定義的函數,可以利用Python的?*args?和?**kw,保證任意個數的參數總是能正常調用:

def log(f):def fn(*args, **kw):print 'call ' + f.__name__ + '()...'return f(*args, **kw)return fn

?

現在,對于任意函數,@log?都能正常工作。

?例子:

請編寫一個@performance,它可以打印出函數調用的時間。

import time def performance(f):def fn(*args, **kw):t1 = time.time()r = f(*args, **kw)t2 = time.time()print 'call %s() in %fs' % (f.__name__, (t2 - t1))return rreturn fn@performance def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)

python中完善decorator

?

轉載于:https://www.cnblogs.com/PeterZhang1520389703/p/7724756.html

總結

以上是生活随笔為你收集整理的Python学习笔记之函数式编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人h动漫精品一区二区器材 | 99精品久久久久 | 欧美人禽杂交狂配 | 伊人久久久久久久久 | 色屁屁www影院免费观看入口 | 欧美黄页网站 | 国产偷人妻精品一区 | 黄色资源在线播放 | 日日夜夜免费 | 99无码熟妇丰满人妻啪啪 | xxxwww在线观看 | 怡红院国产 | 日本国产一区 | 片多多在线观看 | 色婷婷丁香 | av在哪里看| 国产白浆在线 | 激情小视频 | 亚洲天堂久久久久 | 巨乳免费观看 | 午夜影视在线观看 | 中国黄色一级毛片 | 天天插天天射 | 美日韩av| av免费入口 | 成人免费视频国产免费 | 日韩少妇精品 | 欧美日韩一区二区三区国产精品成人 | 亚洲成人激情视频 | 伊人成人在线 | 在线伊人 | 激情五月婷婷综合网 | 风韵多水的老熟妇 | 国产精品国产三级国产播12软件 | 日批在线视频 | 男人在线视频 | 精品国产午夜 | 狠狠爱网站| 亚洲一区二区三区人妻 | 精品国产乱码一区二区三区99 | 成人毛片在线视频 | 国产乱妇无码大片在线观看 | 天堂网在线最新版www中文网 | 欧美精品v | 国产综合一区二区 | 亚洲一区二区三区香蕉 | 婷婷影音 | 青春草视频在线免费观看 | 成人黄色一区二区三区 | 天天干天天操天天舔 | 婷婷成人av | 高清一区二区三区四区五区 | 无码国产色欲xxxx视频 | 亚洲开心网 | 97超碰免费在线观看 | 亚洲美女一区 | 在线观看亚洲a | 久久9热| 性色国产成人久久久精品 | 激情五月婷婷在线 | 亚洲中文字幕无码一区二区三区 | 久久精品香蕉 | 毛片官网 | 扒开伸进免费视频 | 美女久久久久久久久久 | 久久久精品一区二区三区 | 黄色h视频 | 人体裸体bbb欣赏 | 美女又黄又免费 | 欧美第七页| 最新av网站在线观看 | 72pao成人国产永久免费视频 | 咪咪色在线视频 | 三级亚洲欧美 | 日本偷拍一区 | 亚洲激情在线 | 手机在线不卡av | 神马午夜伦理 | 高清日韩一区二区 | 久草操 | 欧美一级少妇 | 先锋影音资源av | ass日本 | 国产亚洲一区二区在线 | 国产又色又爽又黄又免费 | 羞羞漫画在线播放 | 日本免费一区二区三区 | 在线91视频 | 亚洲国产精品成人久久蜜臀 | 成人久久免费视频 | 天天干天天色 | 成人91免费 | 日韩午夜一区 | 国产精品一区久久 | √天堂8资源中文在线 | 成年人免费小视频 | 欧美日韩综合在线 | 九色首页 | 手机看片久久久 |