一.匿名函式
1.定義:定義函式的時候不需要定義函式名
2.具體例子:
#普通函式
def add(x,y): return x + y
#匿名函式
lambda x,y: x + y
呼叫匿名函式:
f = lambda x,y: x + y #賦值后可以呼叫 print(f(1,2)
lambda中(也就是:后面)只能進行簡單的運算式操作,不能進行賦值操作,
二. 三元運算式
格式為:條件為真時回傳的結果 if 條件判斷 else 條件為假時回傳的結果
x = 2 y = 1 r = x if x > y else y print(r) #2
三元運算式在lambda中運用比較多,
三.map類
1.定義:map(函式,序列),把序列中所有值依次傳到函式中并依次接受回傳結果組成一個list,
其實是一個函式的映射,
2.求平方:
list_x = [1,2,3,4,5,6,7,8] def square(x): return x * x r = map(square,list_x) print(list(r)) #[1, 4, 9, 16, 25, 36, 49, 64]
四.map與lambda
將map和lambda函式結合:
1
list_x = [1,2,3,4,5,6,7,8] r = map(lambda x: x * x,list_x) print(list(r)
2 接受多個引數:
list_x = [1,2,3,4,5,6,7,8] list_y = [1,2,3,4,5,6,7,8] r = map(lambda x,y: x * x + y,list_x,list_y) print(list(r))
注意:若個數不相等,不會報錯,但只能計算到最少的那位
五.reduce
1.

2. reduce運算的規則:做連續的計算,連續的呼叫lambda運算式,
reduce下的函式一定要有兩個引數,
3.例子:
from functools import reduce list_x = [1,2,3,4,5,6,7,8] r = reduce(lambda x,y:x + y,list_x) print(r) #36
運算程序:初始取前兩位,之后將計算結果作為x傳進去繼續順序取:
((((((1 + 2)+3) + 4)+ 5)+6)+7)+8
4.注意點:
- 繼續做什么操作是lambda確定的,不僅只能夠相加,
- 最后一位可以設定初始值,在第一次計算中就進行計算了:
eg:r = reduce(lambda x,y:x + y,list_x,10)
六. filter
1.filter可以過濾掉不符合規則的資料,

2.例子:
剔除資料為0的元素:
list_x = [1,0,0,1,0,1,1,0,1] r = filter(lambda x: True if x == 1 else False,list_x) print(list(r)) #[1, 1, 1, 1, 1]
簡化為:
list_x = [1,0,0,1,0,1,1,0,1] r = filter(lambda x: x ,list_x) print(list(r)) #[1, 1, 1, 1, 1]
filter回傳值的要是真和假才能完成過濾
七.命令式編程vs函式式編程
命令式編程涉及到 def if else for
函式式編程涉及到 map reduce filter lambda(算子)
八. 裝飾器 一
import time def f1(): print(time.time()) print('This is a function') f1() #1532404967.3804688 #Unix時間戳 This is a function
如果很多的函式都要獲取時間的功能:
import time def f1(): print('This is a function') def f2(): print('This is a function') def print_current_time(func): print(time.time()) func() print_current_time(f1) print_current_time(f2)
這種需求變更方案的缺點:列印時間的需求是屬于每個函式本身的,并不是新增加的,并沒有體現函式本身的特性,
這就是裝飾器所要解決的問題,
裝飾器 二
撰寫裝飾器:
import time def decorator(func): def wrapper(): print(time.time()) func() return wrapper def f1(): print('This is a function') f = decorator(f1) #f得到了return的wrapper f()
裝飾器 三
語法塘:
import time def decorator(func): def wrapper(): print(time.time()) func() return wrapper @decorator #@符號 def f1(): print('This is a function') f1()
沒有改變呼叫的邏輯也沒有改變函式編碼,是裝飾器的意義所在,
@decorator相當于對f1()裝飾,
裝飾器 四
1.帶參函式的裝飾器:
import time def decorator(func): def wrapper(func_name): print(time.time()) func(func_name) return wrapper @decorator def f1(func_name): print('This is a function named' + func_name) f1('test_func')
2.若多個函式接受不同數量的引數:
import time def decorator(func): def wrapper(*args): print(time.time()) func(*args) return wrapper @decorator def f1(func_name): print('This is a function named' + func_name) @decorator def f2(func_name1,func_name2): print('This is a function named'+func_name1 ) print('This is a function named'+ func_name2) f1('test_func') f2('test_func1','test_func2') #可以支持不同引數個數的函式
裝飾器 五
1.*args不支持**關鍵字引數
支持關鍵字引數:
import time def decorator(func): def wrapper(*args,**kw): #加入**kw,較為完整 print(time.time()) func(*args,**kw) return wrapper @decorator def f1(func_name): print('This is a function named' + func_name) @decorator def f2(func_name1,func_name2): print(func_name1 + func_name2) @decorator def f3(func_name1,func_name2,**kw): print(func_name1 + func_name2) print(kw) f1('test_func') f2('123','234') f3('123','234',a = 1, b = 2,c = '123') #1532408656.565761 #This is a function namedtest_func #1532408656.5667255 #123234 #1532408656.5677273 #123234 #{'a': 1, 'b': 2, 'c': '123'}
2.
def decorator(func): def wrapper(*args,**kw): #加入**kw,較為完整 print(time.time()) func(*args,**kw) return wrapper func(*args,**kw)這個形式,無論什么方式都可以呼叫,
裝飾器 六
如果想對某個封裝單元修改,可以加上裝飾器,
不需要破壞代碼實作,易于代碼復用,
一個函式能夠有多個裝飾器,
需要驗證身份的函式上加上專門的裝飾器之類的用途,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195326.html
標籤:Python
上一篇:反-反爬蟲的一些小技巧
