[TOC]
## 函數定義:
* 定義:
函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
* 特性:
減少重復代碼
使程序變的可擴展
使程序變得易維護
### 語法定義
* 不帶參數的函數
```
def sayhi():#函數名
print("Hello, I'm nobody!")
sayhi() #調用函數
```
* 帶參數的函數
```
def calc(x,y):
res = x**y
return res #返回函數執行結果
c = calc(a,b) #結果賦值給c變量
print(c)
```
> 參數可以讓你的函數更靈活,不只能做死的動作,還可以根據調用時傳參的不同來決定函數內部的執行流程
## 函數參數
### 形參和實參
簡單來說,形參就是函數定義的時候使用的參數,實參就是函數實際調用的時候傳入的參數

### 默認參數
默認參數就是指函數定義時,給該參數指定了一個默認值,如果該參數最終傳入時指定了值就用指定值,沒有指定就用函數定義時給定的默認值
默認參數定義必須在非默認參數后面
```
def stu_register(name,age,country="CN"):
print("----注冊學生信息------")
print("姓名:",name)
print("age:",age)
print("國籍:",country)
stu_register("王山炮",22)
stu_register("張叫春",21,"JPS")
```
> country 就是默認參數,
### 關鍵參數
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可(指定了參數名的參數就叫關鍵參數).
關鍵參數必須放在位置參數(以位置順序確定對應關系的參數)之后
```
def stu_register(name, age ,country='CN'):
print("----注冊學生信息------")
print("姓名:", name)
print("age:", age)
print("國籍:", country)
```
調用可以這樣
`stu_register("王山炮", 22,country='JP')`
但不可以這樣
`stu_register("王山炮", age=22,'JP')`
也不能賦值多次
`stu_register("王山炮",22,age=25,country='JP' )`
### 非固定參數
若函數在定義時不確定用戶想傳入多少個參數,就可以使用非固定參數,須在普通參數之后定義
* `*args`元組類型非固定參數
元組類型非固定參數直接寫值就可以了
```
def stu_register(name,age,*args): # *args 會把多傳入的參數變成一個元組形式
print(name,age,args)
stu_register("Jack",32,"CN","Python")
```
> Jack 32 ('CN', 'Python')
* `**kwargs`字典類型非固定參數
字典類型非固定參數,需要指定值對于的key
```
def stu_register(name,age,*args,**kwargs): # *kwargs 會把多傳入的參數變成一個dict形式
print(name,age,args,kwargs)
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
```
>Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}
## 返回值
函數外部的代碼要想獲取函數的執行結果,就可以在函數里用return語句把結果返回
```
def stu_register(name, age, course='PY' ,country='CN'):
print("----注冊學生信息------")
print("姓名:", name)
print("age:", age)
print("國籍:", country)
print("課程:", course)
if age > 22:
return False
else:
return True
registriation_status = stu_register("王山炮",22,course="PY全棧開發",country='JP')
if registriation_status:
print("注冊成功")
else:
print("too old to be a student.")
```
> 注意
函數在執行過程中只要遇到return語句,就會停止執行并返回結果,so 也可以理解為 return 語句代表著函數的結束
如果未在函數中指定return,那這個函數的返回值為None
## 變量與作用域
### 全局與局部變量
在函數中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的函數。
當全局變量與局部變量同名時,在定義局部變量的函數內,局部變量起作用;在其它地方全局變量起作用。
### 名稱空間
name space, 顧名思義就是存放名字的地方,存什么名字呢?舉例說明,若變量x=1,1存放于內存中,那名字x存放在哪里呢?名稱空間正是存放名字x與1綁定關系的地方
名稱空間共3種,分別如下
* locals:
是函數內的名稱空間,包括局部變量和形參
* globals:
全局變量,函數定義所在模塊的名字空間
* builtins:
內置模塊的名字空間
### 作用域(scope)
通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
不同變量的作用域不同就是由這個變量所在的命名空間決定的。
* 作用域查找順序LEGB
` locals -> enclosing function -> globals -> __builtins__`
locals 是函數內的名字空間,包括局部變量和形參
enclosing 外部嵌套函數的名字空間
globals 全局變量,函數定義所在模塊的名字空間
builtins 內置模塊的名字空間
### 如何在函數里修改全局變量?
```
name = "noah luo"
def change_name():
global name
name = "noah is luo gang"
print("after change", name)
change_name()
print("在外面看看name改了么?", name)
```
> global name的作用就是要在函數里聲明全局變量name
- 基礎部分
- 基礎知識
- 變量
- 數據類型
- 數字與布爾詳解
- 列表詳解list
- 字符串詳解str
- 元組詳解tup
- 字典詳解dict
- 集合詳解set
- 運算符
- 流程控制與循環
- 字符編碼
- 編的小程序
- 三級菜單
- 斐波那契數列
- 漢諾塔
- 文件操作
- 函數相關
- 函數基礎知識
- 函數進階知識
- lambda與map-filter-reduce
- 裝飾器知識
- 生成器和迭代器
- 琢磨的小技巧
- 通過operator函數將字符串轉換回運算符
- 目錄規范
- 異常處理
- 常用模塊
- 模塊和包相關概念
- 絕對導入&相對導入
- pip使用第三方源
- time&datetime模塊
- random隨機數模塊
- os 系統交互模塊
- sys系統模塊
- shutil復制&打包模塊
- json&pickle&shelve模塊
- xml序列化模塊
- configparser配置模塊
- hashlib哈希模塊
- subprocess命令模塊
- 日志logging模塊基礎
- 日志logging模塊進階
- 日志重復輸出問題
- re正則表達式模塊
- struct字節處理模塊
- abc抽象類與多態模塊
- requests與urllib網絡訪問模塊
- 參數控制模塊1-optparse-過時
- 參數控制模塊2-argparse
- pymysql數據庫模塊
- requests網絡請求模塊
- 面向對象
- 面向對象相關概念
- 類與對象基礎操作
- 繼承-派生和組合
- 抽象類與接口
- 多態與鴨子類型
- 封裝-隱藏與擴展性
- 綁定方法與非綁定方法
- 反射-字符串映射屬性
- 類相關內置方法
- 元類自定義及單例模式
- 面向對象的軟件開發
- 網絡-并發編程
- 網絡編程SOCKET
- socket簡介和入門
- socket代碼實例
- 粘包及粘包解決辦法
- 基于UDP協議的socket
- 文件傳輸程序實戰
- socketserver并發模塊
- 多進程multiprocessing模塊
- 進程理論知識
- 多進程與守護進程
- 鎖-信號量-事件
- 隊列與生產消費模型
- 進程池Pool
- 多線程threading模塊
- 進程理論和GIL鎖
- 死鎖與遞歸鎖
- 多線程與守護線程
- 定時器-條件-隊列
- 線程池與進程池(新方法)
- 協程與IO模型
- 協程理論知識
- gevent與greenlet模塊
- 5種網絡IO模型
- 非阻塞與多路復用IO實現
- 帶著目標學python
- Pycharm基本使用
- 爬蟲
- 案例-爬mzitu美女
- 案例-爬小說
- beautifulsoup解析模塊
- etree中的xpath解析模塊
- 反爬對抗-普通驗證碼
- 反爬對抗-session登錄
- 反爬對抗-代理池
- 爬蟲技巧-線程池
- 爬蟲對抗-圖片懶加載
- selenium瀏覽器模擬