1. 程式人生 > >Python3匿名函數字典排序、生成式與生成器、裝飾器簡介

Python3匿名函數字典排序、生成式與生成器、裝飾器簡介

ner 快速 別人 人的 pro 切面 gen 高階函數 表現

1. 參數匿名函數字典排序

函數的參數:

參數類型:
我們經常在看別人的代碼中,經常出現def(*args,**kwargs)這樣的表現形式;

*args           tuple(1,)
**kwargs        dict{"k" : "v"}

fun(*args,**keargs)
fun(1,2,3,4,5,a=10,b=40)

匿名函數:

匿名函數的定義:
顧名思義就是沒有名字的函數,那為什麽要設立匿名函數,他有什麽作用?
lambda函數是一種快速付款定義機器智能單行的最小函數,可以用在任何需要函數的地方.

def fun(x,y)
    return x*y

lambda方法:

r=lambda x,y:x*y
ss求絕對值(abs)

高階函數:

map(f,list) 返回每個元素通過結果計算完的value的list

def f(x):
    return x*x

map(f,[1,2,3,4,5])
reduce(f,[1,2,3,4,5])
filter(lamdba x:x%2 == 1,[1,2,3,4,5])
sorted函數:

sorted(...)
    sorted(iterable,cmp=None,key=None,reverse=False) -->new sorted list

對字典進行排序:

按照value進行排序:

mm = dict(a=1,b=10,c=3,d=9)
print sorted(mm.iteritems(),key = lamdba d:d[1],reverse = True)
#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time   :2018/1/28 18:55
# @Author :FengXiaoqing
# @file   :dicSort.py

def sortDictValue(dict1):
    print(sorted(dict1.items(),key=lambda d:d[1],reverse=False))

if __name__ == ‘__main__‘:
    aaa = dict(a=100,b=10,c=50,d=1)
    l = list()
    l = sortDictValue(aaa)
    print(l)
    print(sortDictValue(l))

2. 生成式和生成器

列表生成式格式:

[exp for val in collection if condition]

[x*x for x in xrange(10) if x*x%2 == 0]

生成器(generator):

方法一:

(exp for val in collection if condition)

方法二:
使用yield關鍵字,包含yield語句的函數會被特地編譯成生成器。
yield可以理解力成return,但是並不退出,只是掛起,恢復的時候從yield下面開始執行。

生成式和生成器的區別:

列表顯示生成式直接返回了表達式的結果列表,面生成器是一個對象,該對象包含了對表達式結果的計算引用,通過結果循環可以直接選舉輸出
生成器不會一次性列出所有的數據,當然你用到的時候,在列出來,更加節約內存的使用率。
類似 range(1,10) xrange(1,10)的區別,但是類型卻不同。

#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time   :2018/1/28 22:34
# @Author :FengXiaoqing
# @file   :production.py

a = [x*x for x in range(1,11) if x%2 ==0]
print (a)
print(type(a))

b = (x*x for x in range(1,11) if x%2 ==0)
print (b)
print(type(b))
for i in b:
    print(i)
print(‘#‘*20)

def test(l):
    for i in l:
        yield i
        print("OK i = {0}".format(i))

m = test([1,2,3,4,5,6])
for i in m:
    print(i)
結果:
[4, 16, 36, 64, 100]
<class ‘list‘>
<generator object <genexpr> at 0x0000000002160D00>
<class ‘generator‘>
4
16
36
64
100
####################
1
OK i = 1
2
OK i = 2
3
OK i = 3
4
OK i = 4
5
OK i = 5
6
OK i = 6

3. 裝飾器

裝飾器的作用:

裝飾器本質上是一個python函數,它可以讓其他工具函數在不需要做任何代碼變動的前提下增加額外功能 ,裝飾器的返回值也是一個函數對象。它經常用於有切面需求的場景,比如:插入日誌、性能測試、事務處理、緩存、權限校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函數功能 本身無關的雷同代碼並繼續重用。
裝飾器的作用簡單點說:就是不改變 原來函數本身,在函數的前面或後面增加一些額外的功能 。
場景:京東購物,放入購物車後在結算前彈出的讓你登錄用戶的窗口。

裝飾器:

在了解裝飾器之前 ,我們先來了解一個callable函數
說明:
1.方法用來檢測對象是否可被調用 ,可被調用 批量的是對象測否使用()括號的方法調用 。
def a():
pass
callable(a)
2.可調用 對象,在實際調用 也可測調用 失敗;但是不可調用 對象,調用 肯定不成功。
3.類對象都 是可被調用 對象,類的實例對象是否可調用 對象,取決於類是否定義了call方法

裝飾器例子:

#!/usr/bin/env python
import datetime

def hellow(fun):
    def preHello():
        print("########start##########“)
        fun()
        print("########end###########“)
    return preHello

原有方法:

def startend(func):
    def start():
        print("#########start#############")
        func()
        print("#########end#############")
    return start
def hello():
    print("hello world!")
hello = startend(hello)
hello()

改進後的使用方法:

def startend(func):
    def start():
        print("#########start#############")
        func()
        print("#########end#############")
    return start

@startend
def hello():
    print("hello world!")
hello()

Python3匿名函數字典排序、生成式與生成器、裝飾器簡介