### 模組化程式設計
> 模組化程式設計指把程式進行封裝(函式封裝,物件導向,檔案。。。)
#### 什麼是函式?
> function -> 函式,功能
> 函式就是乙個具有特定功能的**塊
#### 函式的作用?
> 函式就是把**進行封裝,以提高**的重用性,提高開發效率,並且降低了後期的維護成本
#### 函式的定義和使用
```python
# 定義函式【基本結構】
def 函式名([引數列表]):
當前函式的具體功能的**
當前函式的具體功能的**
# 函式封裝完並不會執行,只是把函式定義了而已
# 如果想使用定義的函式,那麼就需要用語法來進行函式的呼叫
# 函式的呼叫
函式名()
#### 函式的特徵及注意事項
1. 函式定義後,不呼叫不執行
2. 不能在函式定義前呼叫函式
3. 函式的呼叫不受次數影響
4. 函式的命名要遵守命名規範
+ 字母數字下劃線,不能以數字開頭
+ 嚴格區分大小寫,不能使用關鍵字
+ 命名最好有意義,且不要使用中文
5. 函式名不要衝突,衝突後會被覆蓋
### 關於函式的引數
> 函式在定義時,可以在引數列表的位置定義形參
> 如果函式有形參,那麼在函式呼叫時也需要給定引數
> 實參將值傳遞給形參的過程,本質上就是變數賦值操作
#### (1)函式引數概念及分類
函式引數:呼叫時需要傳遞的資料.
函式引數大類分為形參和實參:
. 形參意思: 函式定義時的引數
. 實參意思: 函式呼叫時的引數
形實關係:函式呼叫時,形參和實參個數需要一一對應
形參種類: 普通引數,預設引數,普通收集引數,命名關鍵字引數,關鍵字收集引數
實參種類: 普通實參,關鍵字實參
#### (2)普通引數
(位置引數)普通的引數,接收實參傳遞的值
#### (3)預設引數:
> 位於普通引數後面,具有預設值的引數
> 語法:(x,y=2) y就是預設引數
#### (4)收集引數:
> 專門收集在函式呼叫時傳遞的多餘的實參
1.普通收集引數:專門用於收集多餘的普通引數,形成乙個新的元組
語法:引數前面加* 例:*args
2.關鍵字收集引數:用於專門收集多餘關鍵字實參,形成乙個新的字典
語法:引數前面加** 例:**kwargs
#### (5)命名關鍵字引數
> 定義時放在*號後面的引數,呼叫時強制必須傳入指定引數名才能呼叫
語法:(a,*,x) x是命名關鍵字引數
如果函式引數中已經有了收集引數,那麼收集引數後面的引數即為命名關鍵字引數
語法:(*args,x,y)
#### (6)形參宣告的位置順序:
> 普通引數 -> 預設引數 -> 收集引數 -> 命名關鍵字引數 -> 關鍵字收集引數
def func(a,b,c=1,*args,d,**kw)
a,b為普通引數,c是預設引數,args是收集引數,d是命名關鍵字引數,kw是關鍵字收集引數
極少出現五種引數同時出現的情況
def func(a,b=2,*,c,d,**kw)
a為普通引數,b是預設引數,c,d是命名關鍵字引數 ,kw是關鍵字收集引數
#### 所有引數的擺放問題
- 實參:普通實參在前,關鍵字引數在後
- 形參:
- 關鍵字收集引數一定在最後出現
- 收集引數推薦在普通引數之後使用
### 函式返回值
> 乙個函式除來可以完成一定功能之外,還可以按需要返回一些內容
> 函式中使用 return 關鍵字來指定返回資料,可以返回任意型別的資料
> 函式的返回值,會把資料返回到呼叫處,可以使用變數接收,或其它處理
函式可以分為兩類
1。執行過程函式: 函式體內完成一定的功能既可,沒有返回值
2。具有返回值的函式: 函式體內完成一定的功能,並且返回乙個結果到函式呼叫處
#### return返回值的特徵
+ 函式中可以使用 return 進行資料的返回
+ 可以使用return 返回 任意內容或資料
+ return 會把返回值,返回到函式呼叫出
+ return 意味著函式的結束,return之後的**不在執行
+ 如果在函式中沒有使用return 或者 return後面沒有任何內容,那麼預設返回 none
```python
# 假設有這樣乙個需求,定義乙個函式,完成兩個數的計算,並把結果輸出
# def jia(n1,n2):
# res = n1+n2
# print(res)
# jia(2,5)
# 需求改變,定義乙個函式,完成兩個數的計算,並把結果返回
def jia(n1,n2):
res = n1+n2
return res
r = jia(2,4)
print(r)
### 變數作用域
> 作用域就是當前起作用,可用的範圍區域
> 變數的有效範圍
全域性變數:在函式內外都可以使用的變數
區域性變數:在函式內部可以使用的變數
區域性變數
函式內定義的變數,區域性變數,在函式外不能使用
全域性變數
在函式內部使用 global 直接定義的變數,就是全域性變數,函式內外都可以使用
在函式外定義的變數,在函式內使用 global 關鍵字進行宣告,那麼也是全域性變數
globals() 獲取全域性資料
locals() 獲取當前作用域的資料
在函式外定義的變數,函式可以訪問,但是不能更改
資料型別的分類:
可變資料型別:在函式外定義的變數,在函式可以使用,
列表和字典
不可變資料型別:在函式外定義的變數,在函式內只能訪問,不能使用其它操作
#### 不光變數有作用域,函式一樣也有相同的作用域
```python
def outer():
print('this is outer function...')
# 在函式內定義的函式,稱為 區域性函式,函式外無法使用
def inner():
print('this is inner function...')
inner()
outer()
# inner()
### nonlocal
> 在內函式中如何使用上一層函式中的區域性變數?
> 在內函式中如果想使用外層函式的變數,那麼需要使用 nonlocal 關鍵字 引用
> 可以引用上一層函式中定義的區域性變數,但依然不能提公升為全域性變數
```python
# 定義乙個外層函式
def outer():
# 外函式的區域性變數
num = 10
# 內函式,區域性函式,在函式的內部定義的函式
def inner():
# nonlocal 關鍵字在區域性函式中使用,
nonlocal num # 可以引用上一層函式中定義的區域性變數,但依然不能提公升為全域性變數
num += 1
print(num)
inner()
outer()
# print(num)
#### 關於函式的文件
```python
def outer():
這裡是讓你些當前函式的文件說明的。
需要說明當前函式的作用,
如果當前函式還有行參,那麼也需要對行參進行一一說明
name: 這個是乙個name引數,有什麼作用。。。
age : 這個表示當前的乙個年齡
:return: 此處說明當前函式的返回值。。。
print(globals())
print(__name__) # 獲取當前指令碼的檔名,
print(__doc__) # 獲取當前指令碼的說明文件
# print(outer.__doc__) # 獲取當前函式的說明文件
魔術變數
__name__ ==> 當前指令碼如果作為主程式,那麼值是 __main__,如果是當做乙個模組,在另外乙個指令碼中引用去使用,那麼值就是當前檔案的名字
__doc__ ==> 當前指令碼的文件說明 在當前指令碼當中的第乙個 三引號注釋就是當前指令碼的說明文件
'__name__': '__main__',
'__doc__': '\n在內函式中如果想使用外層函式的變',
'__package__': none,
'__loader__': <_frozen_importlib_external.sourcefileloader object at 0x110444350>,
'__spec__': none,
'__annotations__': {},
'__builtins__': ,
'__file__': '/users/yc/desktop/code/8.nonlocal關鍵字.py',
'__cached__': none, 'outer':
模組化程式設計 函式定義
在軟體開發的過程中,我們經常會重複的使用一些 片段,因此我們往往將這樣的 片段作為函式進行呼叫。函式有4種模式的定義和使用 q有引數,有返回值 y f x q有引數,無返回值 f x q無引數,有返回值 y f q無引數,無返回值 f 在遊戲 圖形 建築領域的軟體應用中,我們經常需要計算幾何圖形的面...
模組化程式設計
將乙個5元素陣列,右移n位,n從鍵盤輸入,首尾相接 例如 陣列中的元素為 那麼 n 3 的結果如下 資料是向右邊移三位,那麼,我轉化成先移一位的情況。因為當移一位的問題解決了,移動n位只需要將此過程迴圈n次即可 1.把a 1 放到臨時空間t t a 1 2.依次把前面元素的值放到後面的空間裡面.從後...
python函式模組化
1.python模組可以在邏輯上組織python程式,將相關的程式組織到乙個模組中去,使用良好的結構化設計,增加程式的重用性,提高 使用率 def print mytest name return mytest name import mytest mytest.print mytest mytes...