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

歡迎訪問 生活随笔!

生活随笔

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

python

python函数式编程读取数据时出现错误_写 Python 代码不可不知的函数式编程技术...

發布時間:2025/4/5 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python函数式编程读取数据时出现错误_写 Python 代码不可不知的函数式编程技术... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題:寫 Python 代碼不可不知的函數式編程技術

選自 Medium

作者:Raivat Shah

參與:魔王、Jamin

本文對 Python 中的函數式編程技術進行了簡單的入門介紹。

近來,越來越多人使用函數式編程(functional programming)。因此,很多傳統的命令式語言(如 Java 和 Python)開始支持函數式編程技術。本文對 Python 中的函數式編程技術進行了簡單的入門介紹。

本文適合對函數式編程有基本了解的讀者。如果你對函數式編程并不熟悉,可以先閱讀這篇文章:https://medium.com/@yannickdot/functional-programming-101-6bc132674ec5。

本文作者是新加坡國立大學計算機學院和「USP」博學計劃學生 Raivat Shah,專注于編程與數據研究。

頭等函數

在 Python 中,函數是「頭等公民」(first-class)。也就是說,函數與其他數據類型(如 int)處于平等地位。

因而,我們可以將函數賦值給變量,也可以將其作為參數傳入其他函數,將它們存儲在其他數據結構(如 dicts)中,并將它們作為其他函數的返回值。

把函數作為對象

由于其他數據類型(如 string、list 和 int)都是對象,那么函數也是 Python 中的對象。我們來看示例函數 foo,它將自己的名稱打印出來:

deffoo:

print( "foo")

由于函數是對象,因此我們可以將函數 foo 賦值給任意變量,然后調用該變量。例如,我們可以將函數賦值給變量 bar:

bar = foo

bar

#will print "foo" to the console

語句 bar = foo 將函數 foo 引用的對象賦值給變量 bar。

把對象作為函數

當對象可調用時(callable),它們與函數一樣,如 object。這是通過 __call__ 方法實現的。

示例如下:

classGreeter:

def__init__( self, greeting):

self.greeting = greeting

def__call__( self, name):

returnself.greeting + " "+ name

每一次配置 Greeter 類的對象時,我們都會創建一個新的對象,即打招呼時可以喊的新名字。如下所示:

morning = Greeter( "good morning") #creates the callable object

morning( "john") # calling the object

#prints "good morning john" to the console

我們可以調用 morning 對象的原因在于,我們已經在類定義中使用了 __call__ 方法。為了檢查對象是否可調用,我們使用內置函數 callable:

callable(morning) # true

callable( 145) # false. intisnotcallable.

數據結構內的函數

函數和其他對象一樣,可以存儲在數據結構內部。例如,我們可以創建 int to func 的字典。當 int 是待執行步驟的簡寫時,這就會派上用場。

# store in dictionary

mapping = {

0 : foo,

1 : bar

}

x = input #get integer value from user

mapping[ x] #call the func returned by dictionary access

類似地,函數也可以存儲在多種其他數據結構中。

把函數作為參數和返回值

函數還可以作為其他函數的參數和返回值。接受函數作為輸入或返回函數的函數叫做高階函數,它是函數式編程的重要組成部分。

高階函數具備強大的能力。就像《Eloquent Java》中解釋的那樣:

「高階函數允許我們對動作執行抽象,而不只是抽象數值。」

我們來看一個例子。假設我們想對一個項目列表(list of items)執行迭代,并將其順序打印出來。我們可以輕松構建一個 iterate 函數:

defiterate(list_of_items):

foritem inlist_of_items:

print(item)

看起來很酷吧,但這只不過是一級抽象而已。如果我們想在對列表執行迭代時進行打印以外的其他操作要怎么做呢?

這就是高階函數存在的意義。我們可以創建函數 iterate_custom,待執行迭代的列表和要對每個項應用的函數都是 iterate_custom 函數的輸入:

defiterate_custom(list_of_items, custom_func):

foritem inlist_of_items:

custom_func(item)

這看起來微不足道,但其實非常強大。

我們已經把抽象的級別提高了一層,使代碼具備更強的可重用性。現在,我們不僅可以在打印列表時調用該函數,還可以對涉及序列迭代的列表執行任意操作。

函數還能被返回,從而使事情變得更加簡單。就像我們在 dict 中存儲函數一樣,我們還可以將函數作為控制語句,來決定適合的函數。例如:

defadd(x, y):

returnx + y

defsub(x, y):

returnx - y

defmult(x, y):

returnx * y

defcalculator(opcode):

ifopcode == 1:

returnadd

elifopcode == 2:

returnsub

else:

returnmult

my_calc = calculator( 2) #my calc is a subtractor

my_calc( 5, 4) #returns 5 - 4 = 1

my_calc = calculator( 9) #my calc is now a multiplier

my_calc( 5, 4) #returns 5 x 4 = 20.

嵌套函數

函數還可以在其他函數內部,這就是「內部函數」。內部函數在創建輔助函數時非常有用,輔助函數即作為子模塊來支持主函數的小型可重用函數。

在問題需要特定函數定義(參數類型或順序)時,我們可以使用輔助函數。這種不遵循傳統做法的操作使得解決問題變得更加簡單,示例參見:http://www-inst.eecs.berkeley.edu/~cs61a/sp12/lectures/lect4-2x3.pdf。

假設你想定義一個斐波那契函數 fib(n),該函數只有一個參數 n,我們必須返回第 n 個斐波那契數。

定義此類函數的一種可行方式是:使用輔助函數來追蹤斐波那契數列的前兩個項(因為斐波那契數是前兩個數之和)。

deffib(n):

deffib_helper(fk1, fk, k):

ifn == k:

returnfk

else:

returnfib_helper(fk, fk1+fk, k+ 1)

ifn <= 1:

returnn

else:

returnfib_helper( 0, 1, 1)

將該計算從函數主體移到函數參數,這具備非常強大的力量。因為它減少了遞歸方法中可能出現的冗余計算。

單表達式函數(Lambda 表達式)

如果我們想在未給函數命名之前寫一個函數要怎么做?如果我們想寫一個簡短的單行函數(如上述示例中的函數 foo 或 mult)要怎么做?

我們可以在 Python 中使用 lambda 關鍵字來定義此類函數。示例如下:

mult = lambda x, y: x * y

mult(1, 2) #returns 2

該 mult 函數的行為與使用傳統 def 關鍵字定義函數的行為相同。

注意:lambda 函數必須為單行,且不能包含程序員寫的返回語句。

事實上,它們通常具備隱式的返回語句(在上面的示例中,函數想表達 return x * y,不過我們省略了 lambda 函數中的顯式返回語句)。

lambda 函數更加強大和精準,因為我們還可以構建匿名函數(即沒有名稱的函數):

( lambdax, y: x * y)( 9, 10) #returns 90

當我們只需要一次性使用某函數時,這種方法非常方便。例如,當我們想填充字典時:

import collections

pre_fill = collections.defaultdict(lambda: (0, 0))

#all dictionary keys and values are set to 0

接下來我們來看 Map、Filter 和 Reduce,以更多地了解 lambda。

Map、Filter 和 Reduce

Map

map 函數基于指定過程(函數)將輸入集轉換為另一個集合。這類似于上文提到的 iterate_custom 函數。例如:

def multiply_by_four(x):

return x * 4

scores = [3, 6, 8, 3, 5, 7]

modified_scores = list(map(multiply_by_four, scores))

#modified scores is now [12, 24, 32, 12, 20, 28]

在 Python 3 中,map 函數返回的 map 對象可被類型轉換為 list,以方便使用。現在,我們無需顯式地定義 multiply_by_four 函數,而是定義 lambda 表達式:

modified_scores = list( map(lambda x: 4* x, scores))

當我們想對集合內的所有值執行某項操作時,map 函數很有用。

Filter

就像名稱所顯示的那樣,filter 函數可以幫助篩除不想要的項。例如,我們想要去除 scores 中的奇數,那么我們可以使用 filter:

even_scores = list(filter(lambda x: Trueif(x % 2== 0) elseFalse, scores))

#even_scores = [6, 8]

由于提供給 filter 的函數是逐個決定是否接受每一個項的,因此該函數必須返回 bool 值,且該函數必須是一元函數(即只使用一個輸入參數)。

Reduce

reduce 函數用于「總結」或「概述」數據集。例如,如果我們想要計算所有分數的總和,就可以使用 reduce:

sum_scores= reduce((lambda x, y: x + y), scores)

#sum_scores = 32

這要比寫循環語句簡單多了。注意:提供給 reduce 的函數需要兩個參數:一個表示正在接受檢查的項,另一個表示所用運算的累積結果。

本文是關于函數式編程的一篇入門文章,雖然盡量完備地介紹了相關的知識,但并不是那么深入。如想了解更多,大家可以閱讀以下資源:

Best Practices for Using Functional Programming in Python: https://kite.com/blog/python/functional-programming/

Functional Programming Tutorials and Notes: https://www.hackerearth.com/zh/practice/python/functional-programming/functional-programming-1/tutorial/

原文鏈接:https://medium.com/better-programming/introduction-to-functional-programming-in-python-3d26cd9cbfd7

號主是非科班進微軟的資深工程師關注就無套路送你一份BAT算法大禮包。返回搜狐,查看更多

責任編輯:

總結

以上是生活随笔為你收集整理的python函数式编程读取数据时出现错误_写 Python 代码不可不知的函数式编程技术...的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日本55丰满熟妇厨房伦 | 国产剧情一区二区 | 久久黄色片视频 | 综合黄色 | av免费国产 | 国产午夜视频在线 | 777色| 翔田千里一区 | 日韩欧美亚 | 日本裸体动漫 | 亚洲自拍天堂 | 免费99视频 | 精品99久久久 | 成人视屏在线观看 | 人人爽人人射 | 国产美女在线精品 | 亚洲清纯唯美 | 欧美视频在线播放 | 天天躁日日躁aaaaxxxx | 成人在线激情网 | 中文字幕在线网 | 好av | 亚洲精品欧美精品 | 极品国产一区 | 日本少妇裸体做爰 | 永久在线 | 福利片在线观看 | 老牛影视av一区二区在线观看 | 丝袜 亚洲 另类 国产 制服 | 国内av网站 | 麻豆一区二区99久久久久 | 精品九九九九九 | 先锋影音av资源在线观看 | 国产精品入口久久 | 成人网在线视频 | 亚洲视频中文字幕 | 中国大陆一级片 | 久久精品视频在线 | 日产精品一区二区 | av在线免费观看不卡 | 开心激情综合网 | 国产又大又硬又粗 | 91欧美一区二区 | 视频精品一区二区 | 日本韩国免费观看 | 青青草免费看 | 日毛片 | 国产福利一区二区三区在线观看 | 男女午夜免费视频 | 国产精品一二三区视频 | 国产情侣酒店自拍 | 欧美性猛交aaaa片黑人 | 亚洲制服一区二区 | 久久国产精品免费看 | 免费观看亚洲 | 日韩av专区 | 黑人玩弄人妻一区二区三区四 | 国产成人在线免费 | 国产免费一级片 | 日本国产一区二区三区 | 国产一区亚洲二区 | 久久精品伊人 | 亚洲成人动漫在线观看 | 99国产精品一区 | 国产日韩精品电影 | 神马午夜视频 | 羞羞涩涩网站 | 天堂成人在线视频 | 欧美丝袜一区二区三区 | 欧美一级免费大片 | 日韩www在线观看 | 性――交――性――乱a | 欧美色图激情 | 亚洲激情视频在线观看 | 久久精品人人做人人爽 | 成年视频在线播放 | 超碰caopeng | 日韩精品人妻中文字幕 | 四虎影库永久在线 | 国产aa大片 | 91在线观看免费 | 午夜欧美日韩 | 国产三级日本三级在线播放 | 韩日中文字幕 | 激情综合丁香五月 | 日本不卡一区二区三区在线观看 | 男人的天堂欧美 | 视频在线一区二区 | 亚洲欧美成人一区二区三区 | 国产麻豆一级片 | juliaann精品艳妇hd | 天天av综合 | av中文字幕网站 | 国产一级免费看 | 欧美成人h版在线观看 | 免费福利视频在线观看 | 精品视频在线播放 | 91精品久久人妻一区二区夜夜夜 | 国产欧美精品一区二区 |