函數和函數式編程

python的過程就是函數,因為解釋器會隱式地返回默認值None。


實際編程中大部分偏函數更接近過程,不顯示地返回任何東西。


當沒有顯示地返回元素或者如果返回None時,python會返回一個None。


* ?元組 ? ?** ?字典


def子句的剩余部分包括了一個雖然可選但是強烈推薦的文檔字串和必須的函數體。


函數的子句由聲明的標題行以及隨后的定義體組成。


裝飾器是在函數調用之上的修飾。


裝飾器的語法以@開頭,接著是裝飾器函數的名字和可選的參數。緊跟著裝飾器聲明的是被修飾的函數和裝飾函數的可選參數。


@decorator(dec_opt_args)

def func2Bdecorated(func_opt_args):

? ? :


裝飾器可以如函數調用一樣“堆疊”起來。


@g

@f

def foo():

? ? :

...與foo=g(f(foo))相同


@deco1(deco_arg)

@deco2

def func():pass

這等價于:

func=deco1(deco_arg)(deco2(func))


裝飾器實際就是函數。他們接收函數對象。


在裝飾器中置入通用功能的代碼來降低程序復雜度。

·引入日志

·增加計時邏輯來檢測性能

·給函數加入事務的能力


函數式是可以被引用的,也作為參數傳入函數,以及作為列表和字典等容器對象的元素函數有一個獨一無二的特征使它同其他對象區分開來,那就是函數式可調用的。


所有的對象都是通過引用來傳遞的,函數也不例外。


foo ? ? ? ? ?函數對象的引用

foo() ? ? ? 函數對象的調用



如果沒有值傳遞給那個參數,那么這個參數將取默認值。


所有必須的參數都要在默認參數之前。


在函數調用時,接受一個不定(非固定)數目的參數。


“*”操作符之后的形參將作為元組傳遞給函數,元組保存了所有傳遞給函數的“額外”的參數。如果沒有給出額外的參數,元組為空。

def function_name([formal_args,] *vargs_tuple):

? ? "function_documentation_string"

? ? function_body_suite


使用字典保存參數名與參數值。“**”是被重載了的以便不與冪運算發生混淆。關鍵字變量參數應該為函數定義的最后一個參數,帶“**”。

def function_name([formal_args,] [*vargst,] **vargsd):

? ? "function_documentation_string"

? ? function_body_suite


關鍵字和非關鍵字可變參數都有可能用在同一個函數中,只要關鍵字字典是最后一個參數并且非關鍵字元組先于它之前出現。


元組和字典參數僅僅是被調函數中最終接收的元組和字典的子集。


匿名函數與lambda


lambda [arg1[,arg2,...argN]]:expression

這個表達式的定義體必須和聲明放在同一行。參數是可選的。


lambda語句由于性能的原因,在調用時繞過函數的棧分配。lambda表達式運作起來就像一個函數,當被調用時,創建一個框架對象。


偏函數應用


一個帶n個參數,curried的函數固化第一個參數為固定參數,并返回另一個帶n-1個參數函數對象。這種函數將任意數量(順序)的參數的函數轉化成另一個帶剩余參數的函數對象。


當調用帶許多參數的函數的時候,PFA是最好的方法。


如果你創建了不帶base關鍵字的偏函數,這可能會讓參數以錯誤的順序傳入int()。


關鍵字參數總是出現在形參之后。


變量作用域


標識符的作用域是定義為其聲明在程序里的可應用范圍,或者即是我們所說的變量可見性。變量可以是局部域或者全局域。


定義在函數內的變量有局部作用域,在一個模塊中最高級別的變量有全局作用域。


聲明適用的程序的范圍被稱為了聲明的作用域。在一個過程中,如果名字在過程的聲明之內,它的出現即為過程的局部變量;否則的話,出現即為非局部。


一個變量的作用域和它寄住的名稱空間相關。


在全局或者內建的名稱空間內,可以覆蓋任何匹配的名字。


如果將全局變量的名字聲明在一個函數體內的時候,全局變量的名字能被局部變量給覆蓋掉。


為了明確地引用一個已命名的全局變量,必須使用global語句。


雖然存在多個函數的嵌套,但你不能訪問超過兩個作用域。


如果在一個內部函數里,對在外部作用域的變量進行引用,那么內部函數就被認為是閉包。定義在外部函數內的但由內部函數引用或者使用的變量被稱為自由變量。


閉包將內部函數自己的代碼和作用域以及外部函數的作用結合起來。


閉包對于安裝計算、隱藏狀態和在函數對象和作用域中隨意地切換是很有用的。


一個lambda表達式定義了新的作用域,所以這個作用域除了局部lambda函數,對于程序其他部分,該作用域都是不能對進行訪問的。


在lambda語句中的表達式有和函數相同的作用域。


任何時候,總有一個或者兩個活動的作用域。


在任何給定的時間,存在兩個或者三個的活動的名稱空間。從函數內部,局部作用域包圍了局部名稱空間,第一個搜尋名字的地方。如果名字存在的話,那么將跳過檢查全局作用域。


如果函數包含了對其自身的調用,該函數就是遞歸的。如果一個新的調用能在相同過程中較早的調用結束之前開始,那么該過程就是遞歸。









本文轉自Grodd51CTO博客,原文鏈接:http://blog.51cto.com/juispan/1960332,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454157.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式,為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度,導致內存空間不夠用。其實針對內存空…

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日,市委書記張新文到曹縣調研重點項目建設情況,研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場,查看項目推進情況。曹州云都大數據中心,是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年,Richard Stallman發起了自由軟件運動,GNU (Gnus Not Unix)項目應運而生,3年后,最初版的GCC橫空出世,成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…

Cassandra 的數據存儲結構——本質是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的數據存儲結構 Cassandra 的數據模型是基于列族(Column Family)的四維或五維模型。它借鑒了 Amazon 的 Dynamo 和 Googles BigTable 的數據結構和功能特點,采用 Memtable 和 SSTable 的方式進行存儲。在 Cassandra 寫入數據之前&a…

清華大學《操作系統》(八):置換算法

功能:置換算法是指當出現缺頁異常時,需要調入新頁面而內存已滿時,置換算法選擇被置換的物理頁面。 設計目標: 盡可能減少頁面的調入調出次數;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定: 了解具…

python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西,它可以對郵件編碼解碼,用來處理郵件非常好用。處理郵件是一個很細致的工作,尤其是解碼郵件,因為它的格式變化太多了,下面先看看一個郵件的源文件:Received: from …

爛泥:通過vsphere給esxi添加本地硬盤

公司ESXi服務器的硬盤空間不夠使用,現在新加了一塊硬盤在ESxi服務器上。在服務器上添加完硬盤后,在Vsphere上是看不到新加硬盤的。 下面我們來通過虛擬機模擬該情況,先添加一塊硬盤。如下圖: 在Esxi添加完硬盤后,現在通…

清華大學《操作系統》(九):進程和線程

進程 定義: 進程是指一個具有一定獨立功能的程序在一個數據集合上的一次動態執行的過程。 組成: 代碼數據狀態寄存器(正在運行的一個程序的所有狀態信息):CPU狀態CP0、指令指針IP通用寄存器:AX、BX、CX…

開始Flask項目

1.新建Flask項目。2.設置調試模式。3.理解Flask項目主程序。4.使用裝飾器,設置路徑與函數之間的關系。5.使用Flask中render_template,用不同的路徑,返回首頁、登錄員、注冊頁。6.用視圖函數反轉得到URL,{{url_for(‘login’)}}&am…

gcc交叉編譯的實現

gcc支持多種不同的語言,也支持多種不同的CPU架構。在它的實現上,不同語言編譯的實現是通過conststruct lang_hooks lang_hooks LANG_HOOKS_INITIALIZER;這個結構體的不同定義來實現的。比如c語言的編譯器就通過gcc/c-lang.c指定了lang_hooks這個結構體的…

爛泥:mysql數據庫使用的基本命令

1、連接數據庫的格式 mysql -h IP -u用戶名 -p密碼; 1.1連接遠程數據庫 mysql -h 192.168.1.214 -uroot -p123456 也可寫成: mysql -h 192.168.1.214 -u root -p 123456 1.2連接本地數據庫 mysql -uroot -p123456 也可寫成: mysql -u root -p 123456 2、…

mse均方誤差計算公式_PCA的兩種解讀:方差最大與均方誤差最小的推導

這張圖片很關鍵,來自統計學習方法的PCA插圖又要考試了,推導一下方差最大化與均方差最小化,老師上課講了一些均方差最小化,推導的過程很詳細不過自己沒有記下來,復習的時候再推一遍加深印象。感謝 耳東陳 老師的精彩課件…

《操作系統》OS學習(十):進程控制

進程切換(上下文切換): 定義:暫停當前運行進程,從運行狀態變成其他狀態,調度另一個進程從就緒狀態變成運行狀態要求:切換前,保存進程上下文;切換后,恢復進程…

日志管理

1、錯誤日志配置 錯誤日志屬于核心功能模塊的參數 worker_processes 1; error_log /data/logs/nginx/error.log error; #一般配置這一行即可 events {worker_connections 1024; }語法規則:error_log file level 錯誤的日志級別有[debug|info|notice|warn|err…

GCC 命令選項使用詳解

GCC 命令行詳解[轉帖] 1、gcc包含的c/c編譯器 gcc、cc、c、g gcc和cc是一樣的,c和g是一樣的,一般c程序就用gcc編譯,c程序就用g編譯 2、gcc的基本用法 gcc test.c這樣將編譯出一個名為a.out的程序 gcc test.c -o test這樣將編譯出一個名為t…

mvn 打包_Spark源碼打包編譯的過程

前言上篇文章介紹了下 安裝sbt環境 啟動scala項目安裝SBT環境運行Scala項目為什么要弄這個 因為我本來是想對spark源碼編譯部署spark是用scala語言編譯的spark源碼https://gitee.com/pingfanrenbiji/sparkspark提供的編譯方式編譯的前提是將所有的依賴包都下載下來而資源包管理…

審計日志功能監控

背景:公司的審計日志經常出現不記錄命令的情況,但是又無法監控到審計功能是否正常。所以我們思路是,每天從CMDB服務器 ssh登錄到每一臺主機。如果審計功能正常,則一定會在auditlog.info文件中有登錄的記錄。如果24小時內這個文件沒…

清華大學《操作系統》(十一):處理機調度

一、處理機調度概念 進程切換(上下文切換):切換CPU的當前任務,從一個進程/線程到另一個,保存當前在PCB/TCB中的執行上下文,讀取下一個的上下文 CPU調度:從就緒隊列中挑選一個進程/線程作為CPU…

通過純css實現圖片居中的多種實現方式

html結構&#xff1a; 1 <div class"demo" style"width: 800px;height: 600px; border:1px solid #ddd"> 2 <img src"default.jpg" width"400" height"300"/> 3 </div> 實現img位于外層div的居中顯示…

GCC 命令行詳解

作者&#xff1a; www.linuxfans.org mozilla 1。gcc包含的c/c編譯器 gcc,cc,c,g,gcc和cc是一樣的&#xff0c;c和g是一樣的&#xff0c;(沒有看太明白前面這半句是什 么意思:))一般c程序就用gcc編譯&#xff0c;c程序就用g編譯 2。gcc的基本用法 gcc test.c這樣將編譯出一個…