## 1\. 匿名函數
大家來思考一個問題:
~~~
def my_add(a, b):
return a + b
my_add()
~~~
my\_add 函數需要2行定義, 能不能簡化一下定義方式, 一行搞定! 當然可以, 我們可以把這種函數寫成一個**匿名函數**.
* 匿名函數的概念
* 匿名函數語法格式
* 匿名函數和普通函數的區別
* 匿名函數的使用場景
### 1.1 語法格式
定義的函數沒有名字,這樣的函數叫做**匿名函數.**
我們先看下匿名函數的語法結構:
~~~
lambda [形參1], [形參2], ... : [單行表達式] 或 [函數調用]
~~~
使用匿名函數, 上面的函數我們就可以定義為單行的函數.
~~~
# 不帶參數
my_fun = lambda : 10 + 20
# 帶參數
my_add = lambda a, b: a + b
my_add()
~~~
### 1.2 和普通函數的區別
~~~
def my_function(start, end):
my_sum = 0
while start <= end:
my_sum += start
start += 1
return my_sum
~~~
1. 匿名函數中**不能使用 if 語句、while 循環、for 循環**, 只能編寫單行的表達式,或函數調用, 普通函數都可以.
2. 匿名函數中返回結果**不需要使用 return**, 表達式的運行結果就是返回結果, 普通函數返回結果必須 return.
3. 匿名函數中也可以不返回結果. 例如:`lambda : print('hello world')`
### 1.3 應用場景
#### 1.3.1 定義簡單的單行函數
~~~
def my_function(a, b):
return a + b
~~~
使用 lambda 定義格式如下:
~~~
my_function = lambda a, b: a + b
~~~
#### 1.3.2 作為函數的參數進行傳遞(重點、難點)
#### 1.3.2.1 為什么函數要作為另外函數的參數?
~~~
def my_function1():
a = 100
b = 200
result = a + b
print('result:', result)
def my_function2():
a = 100
b = 200
result = a - b
print('result:', result)
def my_function3():
a = 100
b = 200
result = a * b
print('result:', result)
~~~
上面函數定義的缺點是:
1. 函數名要定義多個, 使用起來不方便. 需要記憶, 那個函數完成什么事情.
2. 上面函數只定義了三種計算方式: a + b、a -b、a \* b, 如果用戶希望 a 和 b 進行除法運算, 那么顯然還需要再寫函數.
解決目標: 1、提高函數的通用性 2、減少代碼量
可以通過傳遞給 my\_function 一個函數來完成.
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 當做函數來調用
result = func(a, b)
print('result:', result)
def caculate_rule(a, b):
return a / b
my_function(caculate_rule)
~~~

### 1.3.2.2. 匿名函數做為函數參數
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 當做函數來調用
result = func(a, b)
print('result:', result)
def caculate_rule1(a, b):
return a / b
def caculate_rule2(a, b):
return a // b
def caculate_rule3(a, b):
return a % b
my_function(caculate_rule1)
my_function(caculate_rule2)
my_function(caculate_rule3)
~~~
我們為了調用 my\_function 函數要寫很多規則, 整個文件中可能就有很多定義的函數代碼, 問題是:
1. 這些函數只會用一次
2. 這些函數也比較簡單
就沒有必要 py 文件中出現這么多無用的代碼. 如何改進:
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 當做函數來調用
result = func(a, b)
print('result:', result)
my_function(lambda a, b: a / b)
my_function(lambda a, b: a // b)
my_function(lambda a, b: a % b)
~~~
### 1.3.2.3. 總結
1. 函數可以做為參數傳遞給另外一個函數, 可以使得函數的實現更加通用.
2. 匿名函數也可以作為參數傳遞給另外一個函數, 對于只需要用到一次函數, 可以通過匿名函數減少代碼量.
- 計算機組成原理和Python基礎知識
- 計算機組成原理
- 編程語言和Python
- 開發第一個Python程序
- 注釋
- 變量以及類型
- 標識符和關鍵字
- 輸出
- 輸入
- 運算符
- 數據類型轉換
- 判斷語句和循環語句
- 判斷語句介紹
- if語句
- 比較、關系運算符
- if...else...語句格式
- if...elif...else語句格式
- if語句的嵌套
- if應用:猜拳游戲
- 循環語句介紹
- while循環
- while循環應用
- while循環的嵌套以及應用
- for循環
- break和continue
- 字符串、列表、元組、字典
- 字符串介紹
- 字符串輸出
- 字符串輸入
- 下標和切片
- 字符串常見操作
- 列表介紹
- 列表的循環遍歷
- 列表的常見操作
- 列表的嵌套
- 元組
- 字典介紹
- 字典的常見操作1
- 字典的常見操作2
- 字典的遍歷
- 集合(擴展)
- 公共方法
- 4.函數(一)
- 4.1.函數介紹
- 4.2.函數定義和調用
- 4.3.函數的文檔說明
- 4.4.函數參數(一)
- 4.5.函數返回值(一)
- 4.6.函數的嵌套調用
- 4.7.函數應用:打印圖形和數學計算
- 5.函數(二)
- 5.1.局部變量
- 5.2.全局變量
- 5.3.多函數程序的基本使用流程
- 5.4.函數返回值(二)
- 5.5.函數參數(二)
- 5.6.拆包、交換變量的值
- 5.7.引用(一)
- 5.8.可變、不可變類型
- 5.9.引用(二)
- 5.10.函數使用注意事項
- 6.強化練習
- 6.1.函數應用:學生管理系統
- 6.2.遞歸函數
- 6.3. 匿名函數
- 6.4.列表推導式
- 6.5.set、list、tuple
- 6.6.高階函數: map reduce filter
- 7.文件操作,綜合應用
- 7.1.文件操作介紹
- 7.2.文件的讀寫
- 7.3.應用1:制作文件的備份
- 7.4.文件的相關操作
- 7.5.應用:批量修改文件名
- 7.6.綜合應用:學生管理系統(文件版)
- 8.面向對象(上)
- 8.1.認識面向對象編程
- 8.2.類和對象
- 8.3.定義類
- 8.4.創建對象
- 8.5.添加和獲取對象的屬性
- 8.6.在方法內通過self獲取對象屬性
- 8.7.魔法方法 - init()
- 8.8.魔法方法 - 有參數的__init__()方法
- 8.9.魔法方法 - str()方法
- 8.10.魔法方法 - del()方法
- 8.11.實操案例 - 烤土豆
- 9.面向對象(中)
- 9.1.實操案例 - 放家具
- 9.2.繼承的概念
- 9.3.單繼承
- 9.4.多繼承
- 9.5.子類重寫父類的同名屬性和方法
- 9.6.子類調用父類同名屬性和方法
- 9.7.多層繼承
- 9.8.通過super()來調用父類的方法
- 10.面向對象(下)
- 10.1.私有屬性和私有方法
- 10.2.修改私有屬性的值
- 10.3.多態
- 10.4.類屬性和實例屬性
- 10.5.靜態方法和類方法
- 11.異常處理與模塊初識
- 11.1.異常
- 11.2.捕獲異常
- 11.3.異常的傳遞
- 11.4.拋出自定義的異常
- 11.5.獲取異常完整信息的正確姿勢
- 11.6.認識模塊
- 11.7.開發模塊
- 11.8.模塊中的__all__(未完成)
- 11.9.python中的包(未完成)
- 12.課后加餐
- 12.1.基礎應用 - 進銷存管理系統(未完成)
- 12.2.基礎應用 - 員工信息管理系統(未完成)
- 12.1.編碼規范 - PEP8編碼規范(未完成)