Python3學習(六)

11. 匿名函數

(1)lambda

格式:lambda parameter_list: expression
parameter_list就是我們普通函數的參數列表,而expression則是一些簡單的表達式(甚至不能是賦值語句),lambda將expression執行得到的結果返回,可以用一個變量接收:ret = lambda a,b: a + b

ret = lambda a,b: a + b
print(ret(1, 2))
=====================
3

(2)三元表達式

在C語言,Java,C++等語言中,三元表達式是這樣的:
條件 ? 條件爲真的結果 : 條件爲假的結果
而在Python中,卻是這樣的:
條件爲真的結果 if 條件 else 條件爲假的結果

x = 1
y = 2
ret = x if x < y else y
print(ret)
=======================
1

12. 高階函數

(1)map類

這個類有些類似於數學中的“函數”,或者說是映射。
第一個參數是函數,第二個參數是一系列變量列表,可以爲多個列表。

l = [1, 2, 3, 4, 5, 6, 7, 8]
def square(x):
	return x ** 2

ret = map(square, l)
print(list(ret))
=======================
[1, 4, 9, 16, 25, 36, 49, 64]

使用map相當於數學中f(x) = x^2,將x代入求出對應的y。
上述代碼也可以改寫爲:
map(lambda x: x ** 2, l)
再看兩種map用法:

# 第一種
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5, 6, 7]
ret = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret))
==========================
[3, 7, 13, 21, 31, 43]

# 第二種
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5]
ret1 = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret1))
=============================
[3, 7, 13, 21]

當兩個參數列表元素不一樣多時,按照較少的那個個數執行,最終得到的結果與短的參數列表長度相同。

(2)reduce

reduce屬於functools模塊,它有三個參數,前兩個和map一樣,最後一個參數是初始值,默認爲None。它和map的區別是,連續對一個序列進行計算。

from functools import reduce

l = [1, 2, 3, 4, 5, 6]
ret = reduce(lambda x, y: x + y, l)
print(ret)
=======================
21

如上述代碼所示,reduce進行計算的過程爲:
先對1和2進行“+”,再將所得結果賦給x,y = 3,再執行lambda,以此類推,則reduce執行到最後,將得到 l 中所有元素的和。
reduce第三個參數是設定初始值:

from functools import reduce

l = ['1', '2', '3', '4', '5']
r = reduce(lambda x, y: x + y, l, 'A')
print(r)
=========================
A12345

(3)filter類

filter類用於過濾,傳入兩個參數,第一個是函數,第二個是參數列表。

l = [1, 0, 1, 1, 0, 1]
ret = filter(lambda x: True if x==1 else False, l)
print(list(ret))
=========================
[1, 1, 1, 1]

Python並不是一個真正的函數式編程的語言,如果對函數式編程感興趣,可以去學一學Lisp語言,它是真正的利用函數式編程的思想來編程。

13. 裝飾器

之前在知乎上看到一個定義,感覺很有趣:
裝飾器就是把一個猴子,塞入煉丹爐,然後就出來一個還是會吃桃子,但有火眼金睛的猴子;還是原來的猴子,但多了特效技能。
裝飾器可以實現多個函數共同所需的功能。比如打印函數調用時的時間

import time
def decorator(func):
	def wrapper():
		print(time.time())
		func()
	return wrapper

def f1():
	print("It's a function.")

f = decorator(f1)
f()
=============================
1581582542.4673233
It's a function.

一種更簡潔的方式:使用@符號。

@decorator
def f1():
	print("It's a function.")

f1()
==========================
1581582586.7955282
It's a function.

如果你的函數是含有參數的話,在wrapper中也要傳入參數,而且若多個函數的參數個數不同,則wrapper應傳入可變參數列表:

def decorator(func):
	def wrapper(*args):
		print(time.time())
		func(*args)
	return wrapper

如果你的函數還含有關鍵字參數"**kwargs"的話,則wrapper中還要添加“**kwargs”參數。

def decorator(func):
	def wrapper(*args, **kwargs):
		print(time.time())
		func(*args, **kw)
	return wrapper

@decorator
def f2(name1, name2, **kwargs):
	print(name1, name2)
	print(kw)

f2('name1', 'name2', a=1, b=2)
============================
1581584784.625067
name1 name2
{'a': 1, 'b': 2}

上述的decorator就是最終裝飾器定義的格式。
另外,一個函數可以使用不止一個裝飾器。

====================================================
Python3的筆記就寫到這裏了,如果對各位有幫助的話,請動動小手給個贊吧。

發佈了10 篇原創文章 · 獲贊 11 · 訪問量 2837
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章