[TOC]
<br>
### 函數的定義
>[info]函數是對程序邏輯進行結構化或過程化的一種編程方法。能將整塊代碼巧妙地隔離成易于管理的小塊,把重復代碼放在函數中而不是進行大量的拷貝。
在python中,使用關鍵字`def`來定義函數,格式如下:
```python
def say_hello(name):
""" 對某人打招呼
:param name: 用戶名姓名
:return:
"""
print("Hello,{user}".format(user=name))
```
`def` 關鍵字后面緊跟著函數名稱,這個實例中的函數名稱就是`say_hello`。
在函數名稱后,允許傳入參數,參數可以是任意一種數據類型,這里實例中表示在使用say_hello函數時,需要傳入一個用戶名`name`,在函數內部會使用到這個`name`的變量。
定義好函數名稱和參數后,使用`:`結束,換行縮進四個字符后,開始函數體,就是函數需要執行的代碼塊。
函數體的第一行,我們經常使用一個三引號包含的字符串,作為函數的文檔說明。
文檔說明不是必須的,但是寫一個清晰簡潔的文檔說明是一個非常好的編程習慣,有很多工具可以根據文檔說明直接生成接口文檔哦,在使用方調用這個接口時,也能清晰知道該函數的描述信息。
### 函數的調用
以上實例,函數定義好后,當程序執行到函數定義位置時,會將函數加載到內存中儲存起來,但是不會直接執行函數,需要用戶明確調用才會執行函數體中的代碼塊。
在python中,我們使用一對圓括號來調用函數。如
```python
say_hello('Milton')
```
運行結果:
```cmd
Hello,Milton
```
能否將函數賦值給一個變量?當然可以,如下
```python
print(say_hello) # 打印函數名,可知道函數已被加載在內存中
greet=say_hello # 將函數賦值給greet
greet("Milton") # greet具有函數say_hello的功能,在greet后面跟著()就表示函數調用
```
運行結果:
```cmd
<function say_hello at 0x000002400B263E18>
Hello,Milton
```
### 函數的返回值
每個函數都會有返回值,函數返回使用關鍵字`return`,以上實例中沒有明確return,實際上會默認返回None
```python
result=say_hello("Cherish") # 將函數的調用結果賦值給result
print(result) # 打印result就知道函數的返回值了
```
運行結果:
```cmd
None
```
在實際使用中,可能并不是簡單的調用函數,在函數中打印一句話就完事了,而是希望獲得某些數據返回給調用方,進行數據的使用,這時就需要在函數中使用`return`特定的內容了。
如下定義一個做加法運算的函數
```python
def add(a,b):
"""
對兩個數據做加法運算,返回對應結果
:param a: 數字a
:param b: 數字b
:return: a+b 的結果值
"""
result=a+b
return result
s1=add(1,2) # 將函數返回值,賦予一個變量s1
s2=add(1,9)
print("s1 =",s1) # 打印函數返回值
print("s2 =",s2)
print("s2-s1 =",s2-s1)
```
運行結果如:
```cmd
s1 = 3
s2 = 10
s2-s1 = 7
```
### 局部變量與全局變量
函數體中的變量,屬于局部變量,離開函數體后,就被銷毀
函數外中的變量,屬于全局變量,如果想在函數體中使用全局變量,則需要使用關鍵字`global` 進行聲明
實例如下:
```cmd
>>> money=100
>>> percent=0.8
>>> def get_money():
... global money
... money = money - 1
... percent = 0.5
... score = 60
...
>>> get_money()
>>> money
99
>>> percent
0.8
>>> score
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'score' is not defined
>>> get_money()
>>> money
98
```
由上面示例可知,money屬于全局變量,在函數get_money中,使用了`global`聲明了money,說明money使用了全局的變量,在函數體中,調用一次,money就-1。
在函數中,雖然也有變量percent,變量名與全局變量名一致,但是不屬于同一個變量,同理,在函數內定義了變量 score,屬于局部變量,在函數外無法使用,一旦在函數外使用,則會報錯:NameError: name 'score' is not defined
### 函數的參數說明
#### 位置參數
安裝函數定義中的參數位置,傳入對應參數值
```python
def say_hello(age,name="Milton"): # 默認值參數必須在沒有默認值參數的后面,否則出錯
print("Hello,{user}. I am {age} years old".format(user=name,age=age))
say_hello(18,"Cherish") # 必須按照函數定義中的參數位置,對應傳入值
say_hello(28) # 第二個參數有默認值,允許不傳值
```
運行結果:
```cmd
Hello,Cherish. I am 18 years old
Hello,Milton. I am 28 years old
```
#### 關鍵字參數
用于函數調用,通過“鍵-值”形式加以指定。可以讓函數更加清晰、容易使用,同時也清除了參數的順序需求。
```python
def say_hello(age,name):
print("Hello,{user}. I am {age} years old".format(user=name,age=age))
say_hello(age=16,name="Evan")
say_hello(name="Evan",age=16)
say_hello(18,name="Milton")
```
運行結果:
```cmd
Hello,Evan. I am 16 years old
Hello,Evan. I am 16 years old
Hello,Milton. I am 18 years old
```
**注意點:**
1. 關鍵字參數之間不存在先后順序
2. 有位置參數時,**位置參數必須在關鍵字參數的前面**,如上,
`say_hello(name="Milton",18)`則會報錯:SyntaxError: positional argument follows keyword argument
#### 參數默認值
為參數提供默認值,調用函數時可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用
```python
def say_hello(age,name="Milton"):
print("Hello,{user}. I am {age} years old".format(user=name,age=age))
say_hello(18) #調用函數時,不傳入參數,則使用默認函數
say_hello(18,"Cherish") #調用函數時,傳入指定參數,則使用對應參數
```
運行結果如:
```cmd
Hello,Milton. I am 18 years old
Hello,Cherish. I am 18 years old
```
#### 不定長參數
##### 包裹位置參數 - 元組(*args)
我們傳進的所有參數都會被args變量收集,它會根據傳進參數的位置合并為一個元組(tuple),args是元組類型
```python
def say_hello(*args):
print(args)
say_hello("Milton","Cherish","Evan") # 不定長位置參數傳參
data=("Milton","Cherish","Evan")
say_hello(*data) # 元組解包裹傳參
```
運行結果:
```cmd
('Milton', 'Cherish', 'Evan')
('Milton', 'Cherish', 'Evan')
```
##### 包裹關鍵字參數 -字典 (**kwargs)
kargs是一個字典(dict),收集所有關鍵字參數
```python
def say_hello(**kwargs):
print(kwargs)
say_hello(name="Milton",age=31,sex="M") # 不定長關鍵字傳參
data={'name': 'Cherish', 'age': 18, 'sex': 'G'}
say_hello(**data) # 字典解包裹傳參
```
運行結果:
```cmd
{'name': 'Milton', 'age': 31, 'sex': 'M'}
{'name': 'Cherish', 'age': 18, 'sex': 'G'}
```
### 匿名函數
有一種特殊的函數,叫匿名函數,它可以不用定義直接使用
在python,使用Lambda表達式,生成匿名函數
格式如:
```python
lambda 參數:操作(參數)
```
例子:
```cmd
>>> f=lambda x:x+1
>>> f(1)
2
```
lambda語句中,**冒號前是參數,可以有多個,用逗號隔開,冒號右邊的是返回值**
還記得前面的加法運算函數 add(a,b) 么,這里使用lambda表達式,可以非常簡潔完成。如下
```cmd
>>> f=lambda x,y:x+y
>>> f(1,3)
4
```
<hr style="margin-top:100px">
:-: 
***微信掃一掃,關注“python測試開發圈”,了解更多測試教程!***
- 前言
- chapter01_開發環境
- chapter02_字符串的使用
- chapter03_列表的使用
- chapter04_字典的使用
- chapter05_數字的使用
- chapter06_元組的使用
- chapter07_集合的使用
- chapter08_輸入輸出
- chapter09_控制流程
- chapter10_實例練習_登錄1
- chapter11_python函數入門
- chapter12_python中的類
- chapter13_輕松玩轉python中的模塊管理
- chapter14_掌握學習新模塊的技巧
- chapter15_通過os模塊與操作系統交互
- chapter16_子進程相關模塊(subprocess)
- chapter17_時間相關模塊(time & datetime)
- chapter18_序列化模塊(json)
- chapter19_加密模塊(hashlib)
- chapter20_文件的讀與寫
- chapter21_階段考核2_登錄
- chapter22_小小算法挑戰(排序&二分法)
- chapter23_用多線程來搞事!
- chapter24_HTTP接口請求(requests)
- chapter25_接口測試框架(pytest)
- chapter26_階段考核3_HTTP接口測試
- chapter27_HTML解析(pyquery)
- chapter28_階段考核4_爬蟲下載網易汽車
- chapter29_python中的那些編碼坑
- chapter30_MySQL數據庫操作
- chapter31 高級特性_迭代器與生成器
- chapter32 高級特性_裝飾器
- chapter33 高級特性_列表處理