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

歡迎訪問 生活随笔!

生活随笔

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

python

less 函数_Python中的函数式编程教程,学会用一行代码搞定所有内容

發布時間:2025/3/19 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 less 函数_Python中的函数式编程教程,学会用一行代码搞定所有内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在本文中,您將了解什么是函數范型,以及如何在Python中使用函數式編程。在Python中,函數式編程中的map和filter可以做與列表相同的事情。這打破了Python的禪宗規則之一,因此函數式編程的這些部分不被認為是“Python式的”。但是由于函數式編程高階編程?的必經之路,所以我們需要了解甚至熟練掌握?。?

命令范式和函數范式

我們先對比一下編程中的命令范式兩個概念:

在命令式范式中,您通過給計算機一個任務序列來完成任務,然后它執行這些任務。在執行它們時,它可以改變狀態。例如,假設你一開始把A設為5,然后你改變A的值,你有變量,在這個意義上,變量內部的值是變化的。

在函數范型中,你不告訴計算機要做什么,而是告訴它是什么。例如:一個數的最大公約數是多少,從1到n的乘積是多少,等等。因此,變量不能改變。一旦你設置了一個變量,它就會一直保持這種狀態(注意,在純函數語言中它們不被稱為變量)。所謂"副作用"(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變量的值),產生運算以外的其他結果。函數式編程強調沒有"副作用",意味著函數要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。

讓我們來看一個典型Python代碼的例子:

a = 3def some_func(): global a a = 5some_func()print(a)

這段代碼的輸出是5。在函數范型中,改變變量是一個大禁忌,而讓函數影響它們范圍之外的東西也是一個大禁忌。函數唯一能做的就是計算并返回結果。

現在你可能會想:“沒有變量,就沒有副作用?”這有什么好處呢?”

如果一個函數使用相同的參數被調用兩次,那么它肯定會返回相同的結果。因為函數沒有副作用,如果你正在構建一個計算的程序,你可以加速這個程序。如果程序知道func(2)等于3,我們可以將其存儲在一個表中。這可以防止程序在我們已經知道答案的情況下重復運行相同的函數。

Map

為了理解map,讓我們首先看看什么是iterables。iterable是任何可以迭代的東西。通常這些是列表或數組,但是Python有許多不同類型的迭代器。您甚至可以創建自己的對象,這些對象可以使用Python中魔法方法進行迭代。這里有兩個方法:

class Counter: def __init__(self, low, high): # set class attributes inside the magic method __init__ # for "inistalise" self.current = low self.high = high def __iter__(self): # first magic method to make this object iterable return self def __next__(self): # second magic method if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1

“魔法方法是python內置方法,不需要主動調用,存在的目的是為了給python的解釋器進行調用,幾乎每個魔法方法都有一個對應的內置函數,或者運算符,當我們對這個對象使用這些函數或者運算符時就會調用類中的對應魔法方法,可以理解為重寫內置函數。”

第一個神奇的方法是用“__ iter__”返回迭代對象,通常在循環開始時使用。

如果我們運行:

for?c?in?Counter(3,?8): print(c)

那么將會輸出:

345678

在Python中,迭代器是一個對象,它只有一個簡單的魔法方法。這意味著您可以訪問對象中的位置,但不能遍歷對象。有些對象將使用方法__next__,如上面代碼中第二個例子。

現在我們知道了什么是可迭代對象,讓我們回到map函數。map函數允許我們將一個函數應用到iterable中的每個項。通常,我們希望對列表中的每一項都應用一個函數,但是要知道對于大多數迭代器來說都是可能的。Map接受兩個輸入,即要應用的函數和可迭代的對象:

map(function,?iterable)

假設我們有一個列表:

[1, 2, 3, 4, 5]

我們希望將列表中的每一個數字進行平方,那么可以這么寫代碼:

x = [1, 2, 3, 4, 5]def square(num): return num*numprint(list(map(square, x)))

Python中的函數是惰性的。如果我們代碼中不包含“list()”,函數將存儲迭代的定義,而不是一個列表。我們需要顯式地告訴Python“將這個轉換為一個列表”,以便我們使用它。

現在寫一個像“square(num)”這樣的普通函數很好,但是它看起來不太對。我們必須定義一個完整的函數才能在map中使用一次?我們可以使用lambda(匿名)函數在map中定義一個函數。

lambda 表達式

lambda表達式是一個單行函數。舉個例子,這個lambda表達式對給定的一個數字求平方:

square?=?lambda?x:?x?*?x

運行程序:

>>> square(3)9

告訴Python這是一個lambda函數,輸入被稱為x,冒號后面的內容就是你對輸入的操作,它會自動返回結果。

現在我們可以將上面的程序簡化:

x?=?[1,?2,?3,?4,?5]print(list(map(lambda num: num * num, x)))

Reduce

Reduce是一個函數,它把一個可迭代的東西變成一個東西。通常,您在一個列表上執行計算以將其縮減為一個數字。Reduce是這樣的:

reduce(function,?list)

我們可以(通常也會)使用lambda表達式作為函數。

列表的乘積是每一個單獨的數字相乘。要做到這一點,你可以:

product?=?1x = [1, 2, 3, 4]for?num?in?x: product?=?product?*?num

但是使用reduce你可以這樣寫:

from?functools?import?reduceproduct?=?reduce((lambda?x,?y:?x?*?y),[1,?2,?3,?4])

Filter

filter函數接受一個iterable并過濾掉在該iterable中不需要的所有東西。

filter通常接受一個函數和一個列表。它將函數應用于列表中的每一項,如果該函數返回True,則不執行任何操作。如果返回False,則從列表中刪除該項目。

語法如下:

filter(function,?list)

讓我們看看一個小例子,沒有過濾器,我們會寫:

x = range(-5, 5)new_list = []for num in x: if num < 0: new_list.append(num)

有了過濾器,這就變成:

x = range(-5, 5)all_less_than_zero = list(filter(lambda num: num < 0, x))

高階函數

高階函數可以將函數作為參數并返回函數。一個非常簡單的例子如下:

def summation(nums): return sum(nums)def action(func, numbers): return func(numbers)print(action(summation, [1, 2, 3]))

partial application

部分應用程序(也稱為閉包)有點奇怪,但是非常酷。您可以調用一個函數而不提供它需要的所有參數。我們來看一個例子。我們想要創建一個函數,它有兩個參數,一個底數和一個指數,并返回底數的指數次方,就像這樣:

def?power(base,?exponent): return base ** exponent

現在我們想要一個專門的平方函數,用冪函數求出一個數的平方:

def?square(base): return power(base, 2)

這是可行的,但如果我們想要一個立方體函數呢?或者是函數的4次方?我們能一直寫下去嗎?嗯,你可以。但是程序員很懶。如果你一遍又一遍地重復同樣的事情,這是一個信號,表明有一種更快的方法可以加快速度,讓你不再重復。我們可以在這里使用部分應用程序。讓我們看一個例子的平方函數使用部分應用程序:

from?functools?import?partial?square?=?partial(power,?exponent=2)print(square(2))

這是不是很酷!我們可以調用需要兩個參數的函數,只需使用一個參數就可以告訴Python第二個參數是什么。

參考:https://medium.com/hackernoon/learn-functional-python-in-10-minutes-to-2d1651dece6f

總結

以上是生活随笔為你收集整理的less 函数_Python中的函数式编程教程,学会用一行代码搞定所有内容的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 57pao国产精品一区 | 亚洲av第一成肉网 | 国产春色 | 黄色av网站免费看 | av无码精品一区二区三区宅噜噜 | 久精品国产 | 97自拍视频 | jizzjizz中国精品麻豆 | 在线www| 成人av播放 | 亚洲一二三四在线 | 欧美性生交xxxxx久久久 | 成人亚洲欧美 | 久久精品一日日躁夜夜躁 | www.亚洲天堂.com| 美女露胸软件 | 国产片网站| 奇米影视在线视频 | 男人疯狂高潮呻吟视频 | 18禁免费无码无遮挡不卡网站 | 精品少妇一区二区三区免费观 | 国产在线视频网 | 美女网站免费视频 | 国产无套丰满白嫩对白 | 人人舔人人干 | 成人在线观看网址 | 好色av | 一级黄色短片 | 91网站在线播放 | 无码人妻aⅴ一区二区三区日本 | 黑人3p波多野结衣在线观看 | 激情五月在线观看 | 在线视频麻豆 | 成年网站免费在线观看 | 污视频网站免费看 | 人妻少妇精品久久 | 亚洲第一页色 | 在线国产毛片 | 永久免费看黄 | 成都电影免费大全 | 99在线视频观看 | 久久久久亚洲AV成人网人人小说 | 亚洲女同女同女同女同女同69 | 亚洲图片在线播放 | jzzjzz日本丰满成熟少妇 | 竹菊影视一区二区三区 | 日韩欧美综合一区 | 中文字幕一区二区三区四区五区 | 亚洲欧美色图 | 亚洲欧美日韩另类在线 | 18一20岁毛毛片 | 中文字幕在线视频一区二区 | 日本高清视频www夜色资源 | missav在线 | 秋霞午夜视频 | xxx视频网站 | 欧美mv日韩mv国产网站app | 亚洲国产精品国自产拍av | 日韩黄色成人 | 国产欧美一级 | 欧洲最强rapper网站直播 | 丁香花在线影院观看在线播放 | 日韩一级二级 | 精品久久久免费 | 亚洲熟女综合色一区二区三区 | 欧美日韩精品国产 | 亚洲片国产一区一级在线观看 | 国产第一页屁屁影院 | 国产黄色录像 | 国产又黄又嫩又滑又白 | 日韩av成人在线观看 | 国产精品国产av | 在线成人看片 | 黄色一级片在线播放 | av丝袜在线观看 | 免费久久精品 | 国产精品v日韩精品v在线观看 | 亚洲好看站 | 成人传媒| 尤物网在线 | www夜插内射视频网站 | 国产视频1 | 国产特级淫片免费看 | 国产精品久久麻豆 | 日韩精品中文字幕一区二区 | 奇米97| 国产a一级 | 在线观看国产免费av | 五月激情六月婷婷 | 不卡久久| 日本午夜影院 | 天堂网中文在线观看 | 999精品在线视频 | 亚洲第一页综合 | 中国黄色一级视频 | 欧美大白屁股 | 亚洲成人a v| 97se亚洲国产综合在线 | 亚洲av无码一区二区三区在线播放 |