摘要:可以簡單理解一塊可重復使用的代碼,我們稱之為函數,當我們調用函數時,這個函數才會執行。可以看到函數內是一個作用域,外面是訪問不到的一般情況。當進入一個函數時,一個新的作用域就被創建了。
Python中的函數和作用域 1. 函數 1.1 函數的簡介
當我們在重復使用某一功能時,我們可能會寫很多重復的代碼,例如我們求圓的周長,當圓的直徑改變時,是不是我們又要重新寫一遍計算過程呢?如果涉及到很復雜的過程,而下次使用僅僅改變參數,那么我們還有必要重復這一過程嗎?
這時我們可以利用函數來解決這一問題。一個功能就像黑盒一樣,我們不需要知道它是怎么工作的,我們只要知道接口(輸入,輸出)即可使用。
例如Python的內置函數print我們只要知道它需要我們提供哪些參數,以及它會給我們怎樣的輸出即可。這就是所謂的抽象,我們不知道工作原理,但也能使用它。所以我們可以寫一個函數(黑盒),設置直徑為輸入,周長為輸出,當函數寫好后,我們只要輸入直徑即可,不用考慮函數內部是如何計算的,我們得到輸出后,繼續做我們想做的事情。
當我們想做一道菜時,有人負責洗菜,有人切菜,有人炒菜,將這些人的工作合在一起,就完成了做菜這個任務,這就是分解的思想,我們將這個任務看成是函數,許多函數在一起完成了一件比較大的事情。
可以簡單理解一塊可重復使用的代碼,我們稱之為函數(function),當我們調用函數時,這個函數才會執行。
1.2 函數的特征名稱
參數 (0 或 多個)
有docstring (可選,但是建議有,注釋的意思)
函數體
返回一些值
以下是定義一個函數簡單的例子,注意函數內要有四個空格的縮進,如果沒有返回值的話,會默認返回None:
#def是用來定義函數的關鍵字 #is_even是函數的名稱 #i是參數(參數可以是任何類型) #三個引號括起來的是docstring #docstring下面的語句是函數體 #return后的是返回值 def is_even( i ): """ Input: i是一個正的int類型 Returns True 如果 i 是偶數, 否則返回 False """ print("inside is_even") return i%2 == 0 #調用函數,并用a接收返回值 a = is_even(2) print(a)2. 作用域 2.1 形參和實參
首先我們先不涉及編程。高中的函數y = f(x),這個x就相當于是形參,指一種抽象,將我們用f(3)的時候,這個3就是實參了,就是實際我們使用的值,形參和實參大致就是這個意思,不要搞混了。例如:
def f( x ):#x是形參 x = x + 1 print("in f(x): x =", x) return x #以下是調用函數 x = 3#初始化x z = f( x )#調用函數,傳入實參,將返回值給z2.2 函數作用域
利用pythontutor網站對代碼的執行進行可視化,我把所有步驟都截了下來,先看圖,右側反映了變量的變化情況。
可以看到函數內是一個作用域,外面是訪問不到的(一般情況)。當進入一個函數時,一個新的作用域就被創建了。函數內的x和外面的x不是一個x,x是不可變量,這和之后的list等數據類型不一樣,之后再說。
函數里可以訪問外面的變量
函數里不可以修改外部定義的變量
以下是是幾個例子,如果有不清楚,可以進入 www.pythontutor.com(我推薦的代碼可視化網站)中嘗試運行。
第一個例子,在外邊定義了一個x,但是在f內又定義了一個x,這兩個x不是一個x,函數內部使用的x是函數內部定義的。
def f(y): x = 1 x += 1 print(x) x = 5 f(x) print(x)
第二個例子,在g中使用的x是外部定義的x
def g(y): print(x) print(x + 1) x = 5 g(x) print(x)
第三個例子,會報錯,不能在內部修改外部的值,UnboundLocalError: local variable "x" referenced before assignment
def h(y): x += 1 x = 5 h(x) print(x)3. 參考
參考了Mit 6.0001的課件
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43133.html
摘要:項目地址閉包在計算機科學中,閉包英語,又稱詞法閉包或函數閉包,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。 項目地址:https://git.io/pytips 閉包(Closure) 在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是...
摘要:局部變量只能在其被聲明的函數內部訪問,而全局變量可以在整個程序范圍內訪問。調用函數時,所有在函數內聲明的變量名稱都將被加入到作用域中。 1. 變量作用域 Python 中,程序的變量并不是在哪個位置都可以訪問的,訪問權限決定于這個變量是在哪里賦值的。變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱。Python 的作用域一共有4種,分別是: L (Local) 局部作用...
摘要:正如儒家經典所闡述修身齊家治國平天下。除此之外,模塊還有如下最基本的屬性在一個模塊的全局空間里,有些屬性是全局起作用的,稱之為全局變量,而其它在局部起作用的屬性,會被稱為局部變量。 導讀:Python貓是一只喵星來客,它愛地球的一切,特別愛優雅而無所不能的 Python。我是它的人類朋友豌豆花下貓,被授權潤色與發表它的文章。如果你是第一次看到這個系列文章,那我強烈建議,請先看看它寫的前...
摘要:正如儒家經典所闡述修身齊家治國平天下。除此之外,模塊還有如下最基本的屬性在一個模塊的全局空間里,有些屬性是全局起作用的,稱之為全局變量,而其它在局部起作用的屬性,會被稱為局部變量。 導讀:Python貓是一只喵星來客,它愛地球的一切,特別愛優雅而無所不能的 Python。我是它的人類朋友豌豆花下貓,被授權潤色與發表它的文章。如果你是第一次看到這個系列文章,那我強烈建議,請先看看它寫的前...
閱讀 2492·2021-09-28 09:36
閱讀 1486·2021-09-22 15:33
閱讀 3636·2019-08-30 15:44
閱讀 1743·2019-08-29 13:14
閱讀 3132·2019-08-29 11:17
閱讀 1441·2019-08-29 11:03
閱讀 2905·2019-08-26 17:10
閱讀 681·2019-08-26 12:13