Python小白入門:第七講|


Python小白入門:第七講||函數

當你需要在程序中多次執行同一項任務時,你不需要反覆編寫該任務的代碼
而只需要編寫一個函數,每次需要執行任務時調用它即可。

在這一講中,你將學習:

  • 如何編寫函數,以及如何傳遞實參,讓函數能夠訪問完成其工作所需的信息;
  • 如何使用位置實參和關鍵字實參,以及如何接受任意數量的實參;
  • 顯示輸出的函數和返回值的函數;
  • 如何將函數同列表、字典、if 語句和while 循環結合起來使用。
  • 如何將函數存儲在被稱為模塊的獨立文件中,讓程序文件更簡單、更易於理解。
  • 函數編寫指南,遵循這些指南可讓程序始終結構良好,並對你和其他人來說易於閱讀。

7.1 如何定義一個函數

<code>def greet():
"""打印hello"""

print("hello")
greet()/<code>

第一行代碼使用關鍵字def指明你所定義的函數的名稱(greet),這是定義函數。注意冒號

第二行代碼是一個文檔字符串,指出函數的作用,你可以對函數進行描述,方便以後使用。

第三行代碼是函數的主體部分,你可以使用縮進來繼續擴展函數。

第四行代碼進行函數的調用,你每次需要使用函數時都需要調用一次

<code># 輸出
hello/<code>

你還可以向函數傳遞信息,只需要在函數後面的括號中指定一個參數,這個參數用來接收你傳遞的任何值

然後在調用的時候將另一個參數傳遞給函數,這個參數是一個具體的值。

<code>def greet(name):
"""打印hello"""
print("hello" + name.title())
greet('qimu')/<code>

函數名後面的參數name是一個形參——函數完成其工作所需的一項信息

調用函數時 ‘qimu’是一個實參——調用函數時傳遞給函數的信息

簡而言之,在greet('qimu')中,將實參'qimu'傳遞給了函數greet(),這個值被存儲在形參name中

7.2 傳遞實參

鑑於函數定義中可能包含多個形參,因此函數調用中也可能包含多個實參。

如何向函數傳遞實參呢?

7.2.1 位置實參——這要求實參的順序和形參的順序一樣

<code>def name(my_name, his_name):
print("my name is" + my_name.title())
print("his name is" + his_name.title())
name('qimu', 'jack')/<code>

這裡有兩個形參,myname和his_name

也有兩個實參 'qimu'和'jack'

需要注意的是 形參和實參必須一一對應,因為my_name只能是qimu,這就是位置實參

需要執行多少次任務就調用函數多少次,只需要每次向函數傳遞所需的實參即可

7.2.2 關鍵字實參——傳遞給函數的名稱—值對

簡言之,就是在實參中將名稱和值關聯起來。

關鍵字實參無需考慮函數調用過程中的實參順序。

<code>def name(my_name, his_name):
print("my name is" + my_name.title())
print("his name is" + his_name.title())
name(my_name = 'qimu', his_name = 'jack')/<code>

my_name ='qimu'和his_name ='jack'可以換順序,並不影響程序的運行結果

7.2.3 默認值

編寫函數時,可以給每個形參指定默認值。

在函數調用過程中給形參提供了實參時,python將使用指定的實參值。否則,使用默認值

<code>def name(my_name, his_name = 'jack'):
print("my name is" + my_name.title())
print("his name is" + his_name.title())
name(my_name = 'qimu')/<code>

7.2.4 等效的函數調用

鑑於可以混合使用位置實參、關鍵字實參和默認值,通常有多種等效的函數調用方式

<code>def name(my_name, his_name = 'jack'):
print("my name is" + my_name.title())
print("his name is" + his_name.title())
name(my_name = 'qimu')
name('qimu')
name('qimu', 'tom')
name(my_name = 'qimu', his_name = 'tom')
name(his_name = 'tom', my_name = 'qimu')/<code>

上述幾種函數調用方式都是等效的

在調用函數時,要避免實參錯誤,如果忘記給函數傳遞實參,python會給你指出這一錯誤

7.3 返回值

7.3.1 返回簡單值

函數並非總是直接顯示輸出,它可以處理一些數據,並返回一個或一組值

函數返回的值被稱為返回值

<code>def get_formatted_name(first_name, last_name)
"""返回整潔的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()

my_name = get_formatted_name('qi', 'mu')
print(my_name)/<code>

函數get_formatted_name()的定義通過形參就受名和姓。

他將名和姓合二為一,在他們之間加上一個空格,並將結果存儲在變量full_name中

調用返回值的函數時,需要提供一個變量,用於存儲返回的值(my_name)

7.3.2 讓實參變成可選的

假如調用函數時無論傳遞兩個,還是三個實參,函數都能處理

<code>def get_formatted_name(first_name, middle_name = ' ', last_name)
"""返回整潔的姓名"""
if middle_name:
full_name = first_name + ' ' + middle_name + ' ' + last_name

else:
full_name = first_name + ' ' + last_name
return full_name.title()

my_name = get_formatted_name('qi', 'mu')
print(my_name)

my_name = get_formatted_name('qi', 'middle', 'mu')
print(my_name)/<code>

注意並非所有人都有中間名,如果你調用這個函數時只提供了名和姓,他將不能正確的運行。

為了讓中間名變成可選的,可給形參middle_name 指定一個默認值——空字符串,並在用戶沒有提供中間名時不使用這個形參。

7.3.3 返回字典

函數可以返回任何類型的值,包括列表和字典等複雜的數據結構

<code>def get_formatted_name(first_name, last_name)
"""返回一個字典,其中包含一個人的信息"""
name = {'first': first_name, 'last':last_name}
return name

my_name = get_formatted_name('qi', 'mu')
print(my_name)/<code>

函數接受名和姓,並將這些值封裝到字典中

存儲first_name的值時,使用的鍵為'first',而存儲last_name時,使用的鍵為'last'。

你還可以在函數中添加一個參數age表示年齡:

<code>def get_formatted_name(first_name, last_name, age=' ')
"""返回一個字典,其中包含一個人的信息"""
name = {'first': first_name, 'last':last_name}
if age:
name['age'] = age
return name

my_name = get_formatted_name('qi', 'mu', age=27)
print(my_name)/<code>

其中age是一個可選的形參,將其默認值設置為空字符串。

7.3 傳遞列表

為什麼要傳遞列表呢?

將列表傳遞給函數後,函數就能直接訪問其內容。

<code>def greet(names):
"""向每個人打招呼"""
for name in names:
message = "hello" + name.title()
print(message)

users_name = ['qimu', 'jack', 'tom']
greet(users_name)/<code>

函數接受一個名字列表,並將其存儲在形參names中。

一旦列表傳遞給了函數,函數就可以對其進行修改(添加,刪除,替換),而且這個修改時永久性的。

有時候,我們也需要禁止函數修改列表,因為一旦函數修改了列表,原先的列表就無法保留了。所以我們可以向函數傳遞副本而不是原件。

切片表示法來創建列表的副本

<code>function_name(list_name[:])/<code>

7.5 傳遞任意數量的實參

有時候,你預先不知道函數要接受多少個實參,好在Python允許函數從調用語句中收集任意數量的實參。

<code>def name(*names)
"""打招呼"""
print("hello" + name.title())

name('qimu')
name('qimu', 'jack', 'tom', 'alien')/<code>

形參名*name中的星號讓Python創建一個名為name的空元組,並將收到的所有值都封裝到這個元組中。

不管收到一個還是三個名字,函數都能妥善處理。

7.5.1 結合使用位置實參和任意數量實參

如果要讓函數接受不同類型的實參,必須在函數定義中將接納任意數量的實參放在形參最後。

Python先匹配位置實參和關鍵字實參,再將餘下的實參都收集到最後一個形參中。

7.5.2 使用任意數量的關鍵字實參

有時候需要接受任意數量的實參,但預先不知道傳遞給函數的會是什麼樣的信息。在這種情況下,可將函數編寫成能夠接受任意數量的鍵值對——調用語句提供多少就接受多少。

<code>def build_profile(first, last, **user_info):
"""創建一個字典,其中包含我們知道的有關用戶的一切"""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile


user_profile = build_profile('albert',
'einstein',
location='princeton',
filed='physics')
print(user_profile)/<code>

形參**user_info中兩個星號讓Python創建一個名為user_info的空字典

7.6 將函數存儲在模塊中

函數的優點之一是,使用他們可將代碼塊與主程序分開。

可以進一步,將函數存儲在被稱為 模塊 的獨立文件中,再將模塊導入到主程序中。

import語句允許在當前運行的程序文件中使用模塊中的代碼。

7.6.1 導入整個模塊

要想讓函數是可導入的,得先創建模塊。

模塊是擴展名為.py的文件,其中包含了函數代碼。

<code># 需要調用函數時
import module_name

module_name.function_name()/<code>

只需遵循上述語法即可完美調用模塊

7.6.2 導入特定的函數

可以導入模塊中特定的函數

<code>from module_name import function_name
from module_name import function_0, function_1, function_2/<code>

7.6.3 使用as給函數指定別名

導入的函數名可能與程序中現有的名稱衝突,或者函數名太長,可指定獨一無二的別名。

<code>from module_name import function_name as fn/<code>

這裡fn隨便啥都可以,但要符合命名規則

7.6.3 使用as給模塊指定別名

<code>import module_name as fn/<code>

7.6.4 導入模塊中所有函數

使用星號可讓Python導入模塊中所有函數

<code>from module_name import */<code>


分享到:


相關文章: