1. 程式人生 > >python入門與進階篇(六)之高階語法及用法

python入門與進階篇(六)之高階語法及用法

    高階知識針對包、類庫的開發者,函式只是一段可執行的程式碼 並不是物件,閉包、函數語言程式設計

閉包=函式+環境變數

a=10
def outer():
    a=25
    def inner(x):
        print(a*x*x)
    return inner
f=outer()
# __closure__內建變數
# 環境變數
print(f.__closure__[0].cell_contents) #25

f(2) # 100
def f1():
    a=10
    def f2():
        # a此時被python認為是一個區域性變數 區域性變數是不影響外部變數的
        a=20
        print(a) #20
    print(a)  #10
    f2()
    print(a) #10

f1() # 10 20 10
#非閉包方式
x=0
def f1(num):
    #global關鍵字可以使用全域性變數
    global x
    y=x+num
    x=y
    return y

print(f1(3)) #3
print(f1(5)) #5
print(f1(8)) #8

#閉包方式
def f1():
    x=0
    def f2(steps):
        #nonlocal關鍵字將變數強制為非本地的區域性變數
        nonlocal x
        x=x+steps
        return x
    return f2

f=f1()
print(f(3)) #3
print(f(5)) #8
print(f(8)) #16
    

匿名函式

#匿名函式 lambda 不需要return 函式體只能是表示式
f=lambda x,y:x+y
print(f(2,3)) #5

三元表示式

x>y 返回x 否則返回y

條件為真的結果 if 條件 else 條件為假的結果

r=x if x>y else y

map

list_x=[1,2,3,4,5]

def squre(x):
     return x*x

# for v in list_x:
#      squre(v)

r=map(squre,list_x)
# [1, 4, 9, 16, 25]
 print(list(r))

map與lambda


list_x=[1,2,3,4,5,6]
list_y=[1,2,3,4,5]

# 以引數較少的為準 list_x->x list_y->y
r=map(lambda x,y:x*x+y,list_x,list_y) 
#[2, 6, 12, 20, 30]
print(list(r))

reduce

from functools import reduce

# reduce 連續計算
list1=['1','2','3','4','5']
#reduce(lambda表示式,引數序列,初始值)
# 執行過程 (((('aaa'+'1')+'2')+'3')+'4')+'5'
r=reduce(lambda x,y:x+y,list1,'aaa')
print(r) #aaa12345

#map/reduce  函數語言程式設計 大資料程式設計模型 對映 歸約 平行計算

filter

list1=[1,0,0,1,1]
# 大小寫的過濾 list2=['a','B','C','d']
#x>0 返回布林值 
r=filter(lambda x:x>0,list1)  #filter 返回一個集合
print(list(r)) #[1, 1, 1]

指令式程式設計與函數語言程式設計

指令式程式設計:def  if else  for 類 物件等

函數語言程式設計:lambda:運算元 map reduce filter 使程式碼更簡潔

裝飾器

#裝飾器
# 在每一個函式前面列印當前時間

import time

#func:核心函式
def decorate(func):
    # *arg 可變引數  **kw:關鍵字引數組成的字典
    def wrapper(*arg,**kw):
        #unix時間戳:是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
        print(time.time())
        # 未知函式引數的函式的通用寫法
        func(*arg,**kw)
    return wrapper

#1個引數 @裝飾器名 語法糖
@decorate 
def f1(func_name):
    print("this is function1"+func_name)

#2個引數
@decorate
def f2(func_name1,func_name2):
     print("this is function2"+func_name1)
     print("this is function2"+func_name2)

# 帶關鍵字引數的情況
@decorate
def f3(func_name1,func_name2,**kw):
     print("this is function3"+func_name1)
     print("this is function3"+func_name2)
     print(kw) # {'a': 1, 'b': 2, 'c': 3}

# 無參
@decorate
def f4():
    print("this is function4")

# 不改變原函式的呼叫方式
#1538815374.121 ,this is function1引數1
f1("引數1") 

# 1538815374.122 this is function2引數1 this is function2引數2
f2("引數1","引數2")

#1538815374.122,this is function3引數1,this is function3引數2,{'a': 1, 'b': 2, 'c': 3}
f3("引數1","引數2",a=1,b=2,c=3)

#1538815374.125,this is function4
f4()

# 裝飾器的應用:flask框架 @api.router使函式成為控制器 
# 還有可以設定對外可以訪問的介面還是需要登入才能訪問的介面的裝飾器 @auth.login.required