python中help函數的用法,詳解Python函數式編程之map、reduce、filter

 2023-10-04 阅读 32 评论 0

摘要:map()、reduce()、filter()是Python中很常用的幾個函數,也是Python支持函數式編程的重要體現。不過,在Python 3.x中,reduce()不是內置函數,而是放到了標準庫functools中,需要先導入再使用。(1)map()。內置函數map()可以將一

map()、reduce()、filter()是Python中很常用的幾個函數,也是Python支持函數式編程的重要體現。不過,在Python 3.x中,reduce()不是內置函數,而是放到了標準庫functools中,需要先導入再使用。

(1)map()。內置函數map()可以將一個函數依次映射到序列或迭代器對象的每個元素上,并返回一個可迭代的map對象作為結果,map對象中每個元素是原序列中元素經過該函數處理后的結果,該函數不對原序列或迭代器對象做任何修改。
>>> list(map(str, range(5)))? #把列表中元素轉換為字符串
['0', '1', '2', '3', '4']
>>> def add5(v):??#單參數函數
????return v+5
>>> list(map(add5, range(10)))? #把單參數函數映射到一個序列的所有元素
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> def add(x, y):?? #可以接收2個參數的函數
????return x+y
>>> list(map(add, range(5), range(5,10)))? #把雙參數函數映射到兩個序列上
[5, 7, 9, 11, 13]
>>> list(map(lambda x, y: x+y, range(5), range(5,10)))
[5, 7, 9, 11, 13]
>>> def myMap(iterable, op, value):?? #自定義函數
????if op not in '+-*/':??? #實現序列與數字的四則運算
??????????return 'Error operator'
????func = lambda i:eval(repr(i)+op+repr(value))
????return map(func, iterable)
>>> list(myMap(range(5), '+', 5))
[5, 6, 7, 8, 9]
>>> list(myMap(range(5), '-', 5))
[-5, -4, -3, -2, -1]
>>> list(myMap(range(5), '*', 5))
[0, 5, 10, 15, 20]
>>> import random
>>> x = random.randint(1, 1e30)??#生成指定范圍內的隨機整數
>>> x
839746558215897242220046223150
>>> list(map(int, str(x)))??#提取大整數每位上的數字
[8, 3, 9, 7, 4, 6, 5, 5, 8, 2, 1, 5, 8, 9, 7, 2, 4, 2, 2, 2, 0, 0, 4, 6, 2, 2, 3, 1, 5, 0]


(2)reduce()。標準庫functools中的函數reduce()可以將一個接收2個參數的函數以迭代累積的方式從左到右依次作用到一個序列或迭代器對象的所有元素上,并且允許指定一個初始值。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])計算過程為((((1+2)+3)+4)+5),第一次計算時x為1而y為2,再次計算時x的值為(1+2)而y的值為3,再次計算時x的值為((1+2)+3)而y的值為4,以此類推,最終完成計算并返回((((1+2)+3)+4)+5)的值。
>>> from functools import reduce
>>> seq = list(range(1, 10))
>>> reduce(add, seq)??#add是上一段代碼中定義的函數
45
>>> reduce(lambda x, y: x+y, seq)? #使用lambda表達式實現相同功能
45

上面這兩段代碼的功能是一樣的,執行過程如下圖:

python中help函數的用法、
>>> import operator???#標準庫operator提供了大量運算
>>> operator.add(3,5)???#可以像普通函數一樣直接調用
8
>>> reduce(operator.add, seq)? #使用add運算
45
>>> reduce(operator.add, seq, 5)?#指定累加的初始值為5
50
>>> reduce(operator.mul, seq)?? #乘法運算
362880
>>> reduce(operator.mul, range(1, 6))??#5的階乘
120
>>> reduce(operator.add, map(str, seq))??#轉換成字符串再累加
'123456789'
>>> ''.join(map(str, seq))?#使用join()方法實現字符串連接
'123456789'
>>> reduce(operator.add, [[1, 2], [3], [4]], []) #這個操作占用空間較大,慎用
[1, 2, 3, 4]

與上面代碼中最后演示的用法類似,作為一種技巧,reduce()函數還支持下面的用法(感謝浙江省浦江中學方春林老師提供本例用法):
>>> from random import randint
>>> lst = [randint(1, 10) for i in range(50)]? #隨機數列表
>>> def tjNum(dic, k):? #統計元素出現次數
????if k in dic:
?????????dic[k] += 1
????else:
?????????dic[k] = 1
????return dic

>>> from functools import reduce
>>> reduce(tjNum, lst, {})
{1: 6, 2: 3, 3: 6, 4: 3, 5: 4, 6: 7, 7: 5, 8: 5, 9: 6, 10: 5}

(3)filter()。內置函數filter()將一個單參數函數作用到一個序列上,返回該序列中使得該函數返回值為True的那些元素組成的filter對象,如果指定函數為None,則返回序列中等價于True的元素。
>>> seq = ['foo', 'x41', '?!', '***']
>>> def func(x):
????return x.isalnum()??? #測試是否為字母或數字
>>> filter(func, seq)???? #返回filter對象
<filter object at 0x000000000305D898>
>>> list(filter(func, seq))???? #把filter對象轉換為列表
['foo', 'x41']
>>> [x for x in seq if x.isalnum()]??#使用列表推導式實現相同功能
['foo', 'x41']
>>> list(filter(lambda x: x.isalnum(), seq))?? #使用lambda表達式實現相同功能
['foo', 'x41']
>>> list(filter(None, [1, 2, 3, 0, 0, 4, 0, 5]))??#指定函數為None
[1, 2, 3, 4, 5]

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/112796.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息