百度飛槳領航團課程Python函式知識整理
阿新 • • 發佈:2021-02-10
近日,百度推出了《百度飛槳領航團零基礎Python速成營》的免費課程。雖然python用了2年了,但都是自學,正好利用這個機會梳理一下,於是就參加了課程。
函式的應用,是Python的強項,這裡就把函式相關內容梳理一下,方便查閱。
一、基礎函式定義
def show_name(name):
print('姓名:', name)
return {'姓名':name}
show_name("小紅")
#輸出:
姓名: 小紅
預設約定:
*def 定義,命名推薦用小寫字母,字母間用_連線
*如果沒有return語句,預設返回None
二、引數順序
def show_info(name, age=18, *books, **kw): print('我的名字叫:', name, '年齡:', age,'其它資訊:',kw) if 'city' in kw: print('來自:', kw['city']) for book in books: print('我有',book,'書') show_info('張三', 18, '語文','數學','計算機', city='北京', height=180, weight=75) #輸出: 我的名字叫: 張三 年齡: 18 其它資訊: {'city': '北京', 'height': 180, 'weight': 75} 來自: 北京 我有 語文 書 我有 數學 書 我有 計算機 書
*函式的引數順序:
- 常規必須引數:此引數呼叫函式時必須提供
- 預設引數:有引數預設值。如果不指定,則使用預設值
- *引數:此引數方式,可以接收一系列引數,引數被當做一個list對待
- **引數:用鍵值對的方式提供引數,被當做一個字典輸入
三、函式的變數作用域
name = '張三'
def print_my_name():
name = '李四'
print(name)
print_my_name()
#輸出:
李四
呼叫print_my_name時,print_my_name範圍內,起作用的是函式內定義的變數。如果要使用函式為的變數,需用global宣告變數:
name = '張三' def change_my_name(): global name print('全域性名', name) name = '李四' print('函式內名', name) change_my_name() 輸出: 全域性名 張三 函式內名 李四
四、lambda匿名函式
add = lambda arg1, arg2: arg1 + arg2 #定義輸入兩個變數,求和的匿名函式
print(add(1,2))
(lambda arg1, arg2: arg1 + arg2 )(1, 2) #等效於上面兩句
#輸出:
3
五、map、reduce函式
*map 用於將一個可迭代的物件(如list)中每一個元素,用指定函式處理,返回一個新的迭代物件
iterB=map(func,iterA)
nums = [1,2,3,4,5,6,7,8,9]
func=lambda x:x**2
square=list(map(func,nums)) #等價於:square=type(nums)(map(func,nums))
print(square)
#輸出:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
*reduce 使用指定函式,依照下圖方式對資料逐次進行處理
from functools import reduce
nums=[14,5,32,87]
func=lambda x,y:x+y
result=reduce(func,nums)
print(result)
#輸出:
138
六、sorted排序函式
在python中,迭代物件(如list),本身有sort()方法,其直接作用於物件本身。
nums=[14,5,32,87]
nums.sort()
print(nums)
#輸出:
[5, 14, 32, 87]
而sorted函式,則是返回一個新的物件,原物件不變。
nums=[14,5,32,87]
new_nums=sorted(nums)
print(new_nums)
#輸出:
[5, 14, 32, 87]
print(nums)
#輸出:
[14, 5, 32, 87]
points = [(5,2), (7,3), (3,4),(1,1),(2,6)] # 按x座標將點排序
func = lambda x:x[0]
new_points=sorted(points, key=func)
print(new_points)
#輸出:
[(1, 1), (2, 6), (3, 4), (5, 2), (7, 3)]
七、裝飾器
裝飾器(Decorators)是 Python 的一個重要部分,是可以修改其他函式的功能的函式。常用在認證、日誌等功能上。
def say(conv):
def sayHello():
print('你好啊')
def sayBye():
print('再見')
sayHello()
conv() #自動執行被傳入的conv函式
sayBye()
@say
def conv1():
print('conv1--')
@say
def conv2():
print('conv2--')
#輸出:
你好啊
conv1--
再見
你好啊
conv2--
再見
用@decorator ,等效於將被裝飾的函式名,傳入裝飾器。
def arg_decorator(func):
def wrapper(*args, **kw):
print(f'{func.__name__} is working...')
func(*args, **kw)
return wrapper
# 帶引數的裝飾器
@arg_decorator
def student_info(name, age=18, *books, **kw):
print(f'我的名字叫{name}, 今年{age}歲,我有很多本書:')
for book in books:
print(book)
print(kw)
student_info('Molly',18, '語文書','數學書',height=170)
#輸出:
student_info is working...
我的名字叫Molly, 今年18歲,我有很多本書:
語文書
數學書
{'height': 170}
帶引數的裝飾器,可以在裝飾器裡使用被裝飾函式傳入的引數。
八、偏函式
使用partial函式,將已有函式的一部分引數固定,構造出一個新的函式。以後再呼叫新函式時,可以輸入更少的引數。
注意partial中輸出引數的順序與原函式引數順序的對應關係。
from functools import partial
def mod(n, m):
return n % m
mod_by_100 = partial(mod, 100) #mod需要兩個引數,100為第一個引數
print(mod(100, 7)) # 2
print(mod_by_100(7)) # 2
下例為通過引數名指定固定的引數。
from functools import partial
def student_info(name, age, city):
print(f'我的名字叫{name}, 今年{age}歲,來自{city}')
student_info_beijing = partial(student_info, city='北京')
student_info_beijing("小紅",22)
輸出:
我的名字叫小紅, 今年22歲,來自北京