一、函式的幾種形式
1. 函式根據有沒有引數和 回傳值,可以組合成下面的四組
- 無參,無值
- 無參,有值
- 有參,有值
- 有參,無值
2.那么我們到底給那種呢?
我給出了如下的總結:
2.1 無引數,無回傳值
此類函式,不接收引數,也沒有回傳值,應用場景如下:
- 只是單純地做一件事情,例如 顯示選單
- 在函式內部 針對全域變數進行操作,例如:新建名片,最終結果 記錄在全域變數 中
注意:
- 如果全域變數的資料型別是一個 可變型別,在函式內部可以使用 方法 修改全域變數的內容 —— 變數的參考不會改變
- 在函式內部,使用賦值陳述句 才會 修改變數的參考
2.2 無引數,有回傳值
此類函式,不接收引數,但是有回傳值,應用場景如下:
- 采集資料,例如 溫度計,回傳結果就是當前的溫度,而不需要傳遞任何的引數
1.3 有引數,無回傳值
此類函式,接收引數,沒有回傳值,應用場景如下:
- 函式內部的代碼保持不變,針對 不同的引數 處理 不同的資料
- 例如 名片管理系統 針對 找到的名片 做 修改、洗掉 操作
2.4 有引數,有回傳值
此類函式,接收引數,同時有回傳值,應用場景如下:
- 函式內部的代碼保持不變,針對 不同的引數 處理 不同的資料,并且 回傳期望的處理結果
- 例如 名片管理系統 使用 字典默認值 和 提示資訊 提示用戶輸入內容
- 如果輸入,回傳輸入內容
- 如果沒有輸入,回傳字典默認值
二、關于回傳值
1.代碼實體
def measuer():
print("開始...")
temp = 30
wetness = 50
print("結束...")
#元祖可以使用多個資料,所以可以放回多個值
# 如果函式回傳的元祖,我們可以丟掉小括號
return temp,wetness
result = measuer()
print(result)
# 單獨的拿出來元素,但是不是恒方便
print(result[0])
# 我們可以使用多個變數一次接受回傳自
gl_temp,gl_wetbess = measuer()
print(gl_temp)
print(gl_wetbess)
2.面試題 —— 交換兩個數字
題目要求
- 有兩個整數變數
a = 6,b = 100 - 不使用其他變數,交換兩個變數的值
解法 1 —— 使用其他變數
# 解法 1 - 使用臨時變數
c = b
b = a
a = c
解法 2 —— 不使用臨時變數
# 解法 2 - 不使用臨時變數
a = a + b
b = a - b
a = a - b
解法 3 —— Python 專有,利用元組
a, b = b, a
三、函式的引數 進階
1.不可變和可變的引數
注意哈,我們這里的知識和之前說過的變數有關!
問題 1:在函式內部,針對引數使用 賦值陳述句,會不會影響呼叫函式時傳遞的 實參變數? —— 不會!
- 無論傳遞的引數是 可變 還是 不可變
- 只要 針對引數 使用 賦值陳述句,會在 函式內部 修改 區域變數的參考,不會影響到 外部變數的參考
def demo(num, num_list):
print("函式內部")
# 賦值陳述句
num = 200
num_list = [1, 2, 3]
print(num)
print(num_list)
print("函式代碼完成")
gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
問題 2:如果傳遞的引數是 可變型別,在函式內部,使用 方法 修改了資料的內容,同樣會影響到外部的資料
def mutable(num_list):
# num_list = [1, 2, 3]
num_list.extend([1, 2, 3])
print(num_list)
gl_list = [6, 7, 8]
mutable(gl_list)
print(gl_list)
2. 面試題 —— +=
- 在
python中,串列變數呼叫+=本質上是在執行串列變數的extend方法,不會修改變數的參考
def demo(num, num_list):
print("函式內部代碼")
# num = num + num
num += num
# num_list.extend(num_list) 由于是呼叫方法,所以不會修改變數的參考
# 函式執行結束后,外部資料同樣會發生變化
num_list += num_list
print(num)
print(num_list)
print("函式代碼完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
3. 預設引數
所謂的預設,實際上,你可以理解為,默認值
- 呼叫函式時,如果沒有傳入 預設引數 的值,則在函式內部使用定義函式時指定的 引數默認值
- 函式的預設引數,將常見的值設定為引數的預設值,從而 簡化函式的呼叫
- 例如:對串列排序的方法
gl_num_list = [6, 3, 9]
# 默認就是升序排序,因為這種應用需求更多
gl_num_list.sort()
print(gl_num_list)
# 只有當需要降序排序時,才需要傳遞 `reverse` 引數
gl_num_list.sort(reverse=True)
print(gl_num_list)
- 關于預設引數需要注意的事情:
1. 首先,引數使用賦值陳述句,可以指定為預設值(默認值)
比如這個的代碼
def print_info(name, gender=True):
2. **必須保證** **帶有默認值的預設引數** **在引數串列末尾**
3. 在 **呼叫函式時**,如果有 **多個預設引數**,**需要指定引數名**,這樣解釋器才能夠知道引數的對應關系!
以下是具體的代碼案例
```python
def print_info(name, title="", gender=True):
"""
:param title: 職位
:param name: 班上同學的姓名
:param gender: True 男生 False 女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s%s 是 %s" % (title, name, gender_text))
# 提示:在指定預設引數的默認值時,應該使用最常見的值作為默認值!
print_info("小明")
print_info("老王", title="班長")
print_info("小美", gender=False)
3.多值引數
- 如何定義一個多值引數?
def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
- 我們希望這個函式能夠處理的引數的個數不確定的時候,我們就可以用的上了
- Python中的多值引數,有兩種
- 引數名前增加 一個
*可以接收 元組 - 引數名前增加 兩個
*可以接收 字典
- 引數名前增加 一個
- 一般在給多值引數命名時,習慣使用以下兩個名字
*args—— 存放 元組 引數,前面有一個***kwargs—— 存放 字典 引數,前面有兩個*
4. 元祖和字典的拆包
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 需要將一個元組變數/字典變數傳遞給函式對應的引數
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
# 會把 num_tuple 和 xiaomin, gl_xiaoming)
demo(*glg 作為元組傳遞個 args
# demo(gl_nums_nums, **gl_xiaoming)
它主要完成的是以下的任務:希望將一個元組/字典變數直接傳遞給args/kwargs
遞回函式,
其實這個是一種演算法,詳見我的博客,演算法分類
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/181819.html
標籤:Python
下一篇:Python_字串方法
