Python初級教程(15): 函數(shù)

在本文中怒炸,您將學(xué)習(xí)函數(shù)带饱。 在Python中,函數(shù)是啥阅羹,它的語法是啥樣纠炮,它的組成部分和類型有哪些月趟。 另外,您還將學(xué)習(xí)在Python中如何創(chuàng)建函數(shù)恢口。

1. 函數(shù)是啥孝宗?

在Python中,函數(shù)是一組執(zhí)行特定任務(wù)的相關(guān)語句耕肩。

函數(shù)有助于將我們的程序分解為較小的模塊化塊因妇。 隨著我們的程序變得越來越大,函數(shù)使其變得更有組織性和可管理性猿诸。

此外婚被,它避免了重復(fù),并使代碼可重用梳虽。

其語法為:

def function_name(parameters):
    """docstring"""
    statement(s)

上面是一個函數(shù)的定義址芯,函數(shù)包括以下部分:

  • 關(guān)鍵字def標(biāo)記函數(shù)頭的開始。

  • 一個用于唯一標(biāo)識它的函數(shù)名稱窜觉。 與標(biāo)識符一樣谷炸,函數(shù)的命名也遵循相同的規(guī)則,Python初級教程(02): 關(guān)鍵字和標(biāo)識符禀挫。

  • 參數(shù)(parameters/arguments)旬陡,我們通過這些參數(shù)將值傳遞給函數(shù)。 函數(shù)也可以沒有參數(shù)语婴。

  • 用冒號:標(biāo)記函數(shù)頭的結(jié)尾描孟。

  • 可選的文檔字符串Docstring,用于描述函數(shù)的功能砰左,可參考Python初級教程(03): 語句匿醒、縮進(jìn)和注釋最后的內(nèi)容。

  • 組成函數(shù)體的一個或多個python語句缠导。 語句必須具有相同的縮進(jìn)級別(通常為4個空格)廉羔。

  • 可選的return語句,用于從函數(shù)中返回一個值酬核。

來看個例子:

def greet(name):
    """This function greets to
    the person passed in as
    parameter"""
    print("Hello, " + name + ". Good morning!")

如何在Python中調(diào)用函數(shù)?

定義好函數(shù)后蜜另,我們就可以從程序、或另一個函數(shù)嫡意,甚至直接在Python提示符下調(diào)用它举瑰。 要調(diào)用函數(shù),我們只需鍵入帶有適當(dāng)參數(shù)的函數(shù)名稱即可蔬螟。比如

>>> greet('Paul')
Hello, Paul. Good morning!

調(diào)用函數(shù)的流程示意圖為:

2. 文檔字符串(Docstring)

函數(shù)頭之后的第一個字符串稱為Docstring此迅,是文檔字符串的縮寫。 它用于簡要說明函數(shù)的功能。

盡管是可選的耸序,但文檔是一種良好的編程習(xí)慣忍些。 除非您的記憶超好,否則請務(wù)必為您的函數(shù)添加適當(dāng)文檔來說明它的功能坎怪。

在上面的示例中罢坝,我們在函數(shù)標(biāo)頭的正下方有一個文檔字符串。 我們通常使用三引號搅窿,以便文檔字符串可以擴(kuò)展到多行嘁酿。 該字符串可作為函數(shù)的__doc__屬性來使用。

看個例子:

>>> print(greet.__doc__)
This function greets to
    the person passed into the
    name parameter

3. return 語句

return語句用于退出函數(shù)并返回到調(diào)用它的位置男应。

它的語法為:

return [expression_list]

該語句可以包含表達(dá)式闹司,表達(dá)式會被求值,并將該值作為返回值沐飘。 如果語句中沒有表達(dá)式或函數(shù)內(nèi)部不存在return語句游桩,則該函數(shù)將返回None對象。比如:

>>> print(greet("May"))
Hello, May. Good morning!
None

在這里耐朴,None是函數(shù)的返回值借卧。

再看個返回值不是None的例子:

def absolute_value(num):
    """This function returns the absolute
    value of the entered number"""

    if num >= 0:
        return num
    else:
        return -num

# Output: 2
print(absolute_value(2))

# Output: 4
print(absolute_value(-4))

上面代碼的運行結(jié)果為:

2
4

4. 變量的作用域和生存期

變量作用域是指我們能夠在多大范圍訪問到變量。在函數(shù)內(nèi)部定義的參數(shù)和變量在外部是不可見的隔箍。因此谓娃,它們具有局部作用域脚乡。

變量的生存期是指變量在內(nèi)存中存在的時間蜒滩。函數(shù)中變量的生存期與函數(shù)執(zhí)行的時間一樣長,一旦從函數(shù)返回奶稠,它們就被銷毀了俯艰。

下面是一個說明函數(shù)中變量的作用域的例子:

def my_func():
    x = 10
    print("Value inside function:", x)

x = 20
my_func()
print("Value outside function:", x)

輸出為:

Value inside function: 10
Value outside function: 20

這里,我們可以看到x的初始值為20锌订。即使my_func()函數(shù)將x的值更改為10竹握,它也不會影響函數(shù)之外的x值。

這是因為函數(shù)內(nèi)部的變量x與外部的變量x是不同辆飘。雖然它們有相同的名稱啦辐,但它們是兩個不同的變量,具有不同的作用域蜈项。

另一方面芹关,函數(shù)外部的變量對于函數(shù)內(nèi)部是可見的。外部變量具有全局域紧卒。

我們可以從函數(shù)內(nèi)部讀取這些值侥衬,但不能更改它們。為了能修改函數(shù)外部變量的值,必須使用關(guān)鍵字global將它們聲明為全局變量轴总。

來看幾個例子:

函數(shù)內(nèi)部可以訪問外部變量:

## variables outside of the function are visible from inside
def my_func():
    print("Value inside function:", x)

x = 20
my_func()
print("Value outside function:", x)

輸出為:

Value inside function: 20
Value outside function: 20

函數(shù)內(nèi)部不能更改外部變量:

## We can read these values from inside the function, but cannot change them
def my_func():
    x = x + 10
    print("Value inside function:", x)

x = 20
my_func()
print("Value outside function:", x)

輸出為:

Traceback (most recent call last):
  File "<ipython-input-4-ba393f2e5c59>", line 7, in <module>
    my_func()
  File "<ipython-input-4-ba393f2e5c59>", line 3, in my_func
    x = x + 10
UnboundLocalError: local variable 'x' referenced before assignment

將函數(shù)內(nèi)部變量設(shè)置為global后直颅,函數(shù)內(nèi)部可以更改外部變量:

## to modify the value of variables outside the function using the keyword global
def my_func():
    global x
    x = x + 10
    print("Value inside function:", x)

x = 20
my_func()
print("Value outside function:", x)

輸出為:

Value inside function: 30
Value outside function: 30

5. 函數(shù)的類型

基本上,我們可以將函數(shù)分為以下兩種類型:

  • 內(nèi)置函數(shù):內(nèi)置于Python中的函數(shù)

  • 用戶自定義的函數(shù):由用戶自己定義的函數(shù)

今天的內(nèi)容就講到這怀樟。


感謝您的閱讀功偿!想了解更多有關(guān)R語言技巧,請關(guān)注我的微信公眾號“R語言和Python學(xué)堂”往堡,我將定期更新相關(guān)文章脖含。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市投蝉,隨后出現(xiàn)的幾起案子养葵,更是在濱河造成了極大的恐慌,老刑警劉巖瘩缆,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件关拒,死亡現(xiàn)場離奇詭異,居然都是意外死亡庸娱,警方通過查閱死者的電腦和手機(jī)着绊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熟尉,“玉大人归露,你說我怎么就攤上這事〗锒” “怎么了剧包?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長往果。 經(jīng)常有香客問我疆液,道長,這世上最難降的妖魔是什么陕贮? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任堕油,我火速辦了婚禮,結(jié)果婚禮上肮之,老公的妹妹穿的比我還像新娘掉缺。我一直安慰自己,他們只是感情好戈擒,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布眶明。 她就那樣靜靜地躺著,像睡著了一般峦甩。 火紅的嫁衣襯著肌膚如雪赘来。 梳的紋絲不亂的頭發(fā)上现喳,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音犬辰,去河邊找鬼嗦篱。 笑死,一個胖子當(dāng)著我的面吹牛幌缝,可吹牛的內(nèi)容都是我干的灸促。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼涵卵,長吁一口氣:“原來是場噩夢啊……” “哼浴栽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轿偎,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤典鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坏晦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝玷,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年昆婿,在試婚紗的時候發(fā)現(xiàn)自己被綠了球碉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡仓蛆,死狀恐怖睁冬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情看疙,我是刑警寧澤豆拨,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站狼荞,受9級特大地震影響辽装,放射性物質(zhì)發(fā)生泄漏帮碰。R本人自食惡果不足惜相味,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殉挽。 院中可真熱鬧丰涉,春花似錦、人聲如沸斯碌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傻唾。三九已至投慈,卻和暖如春承耿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伪煤。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工加袋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抱既。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓职烧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親防泵。 傳聞我的和親對象是個殘疾皇子蚀之,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345