裝飾器

裝飾器:python

  從名字上來看,裝飾器就是用來裝飾內容的一個工具.本質上是一個閉包數組

  在開發中,裝飾器必需要遵照開放封閉原則:對擴展開放,對修改源代碼封閉.閉包

  在裝飾器中,有一個很重要的工具就是@,稱之爲語法糖,語法糖的本質就是:被裝飾的函數名 = 裝飾器的名字(被裝飾的函數名)app

  在裝飾器的應用上,有一個很簡單的例子函數

計算簡易的函數運行時間工具

import time                  # 導入time模塊 print(time.time())              # 獲取時間戳 start_time = time.time()          # 開始時間 def foo():                   # 定義函數foo time.sleep()               # 能夠本身定義睡眠時間 print(100)       foo()                     # 調用函數foo end_time = time.time()            # 結束時間 在這時,函數的運行時間爲end_time-start_time

接一個比較規範的寫法:學習

import time                  1,導入time模塊  def func(x):                   2,定義func函數,此時必須有形參 def wapper():                5,定義wapper函數 start_time = time.time()       9, x()                   10,這兒的x是foo的內存地址,加括號是調用foo函數 end_time = time.time()        12, print(start_time - end_time)     13, return wapper                6,將wapper函數的內存地址返回給調用者func def foo():                    3,定義foo函數 print("今天週二")              11,執行print foo = func(foo)                 4,等號右邊,將foo的內存地址傳給了func函數的x                           7,等號左邊,將wapper的內存地址賦給了foo,
foo()                      8,調用wapper函數

 如今用一個裝飾器來寫:測試

def func(x):                 def wapper(*args,**kwargs): x(*args,kwargs) return wapper @func                      @加裝飾器的名字,就至關於:inner = func(inner) def inner(*args,**kwargs): print(*args) inner()                    ps:這是最簡單的一種裝飾器

 

內置函數,編碼

    python中提供的一些工具,咱們能夠直接拿過來用,咱們知道,在python中有68個內置函數.在以前已經接觸過input,print,id,globals,locals等幾個函數;spa

  今天來繼續學習一些內置函數,在目前所學的知識中,比較重要的函數,主要有enumerate,lambda,sorted,filter,map,zip,reduce

enumerate,枚舉

for i in enumerate():    括號中第一個參數必須是可迭代對象,第二個參數是起始值,能夠本身定義,默認爲0 print(i)
for i in enumerate("166",1)
  print(i)
          輸出結果爲(1,'1'),(2,'6'),(3,'6')

lambda,匿名函數

  匿名函數定義時,沒有def,沒有函數名,它有形參,能夠接收多個形參,查名字能夠用:函數.__name__

格式爲:  lambda 參數:返回值

f = lambda x:x+x print(f(3)) 輸出內容爲:6
能夠直接寫:print((lambda x:x+x)(3)),調用時要傳參

sorted,排序

print(sorted(可迭代對象))          默認是升序 print(sorted(可迭代對象),reverse=True)  降序

例1:

sorted('可迭代對象',key='函數名',reverse=True)      函數名裏寫排序的規則,能夠指定升序或者降序 lst = ['光年以外','bgm','這個世界太瘋狂','accord'] print(sorted(lst,key=lambda x:len(x),reverse=True))
    輸出結果爲:['這個世界太瘋狂','accord','光年以外','bgm']

filter 篩選過濾

  filter('寫好過濾規則的函數','可迭代對象')

篩選列表:
lst
= [1,2,3,4,5,6] print(list(filter(lambda x:x>3
,lst)))      結果爲:[4,5,6]
篩選字典: dic = [{'name':'依依','age':18},{'name':'小五子','age':20}] print(list(filter(lambda x:x['age']>18,dic)))        結果爲:{'name':'小五子',''age':20}

map,映射函數

1,能夠快速實現列表內每一個元素的基礎運算,加,乘...

2,能夠快速的將多個可迭代對象,元素位置相同的進行上下累加

lst = [1,2,3,4,5,6] lst1 = [2,3,4,5,6,7] print(list(map(lambda x,y:x+y,lst,lst1)))        結果爲[3,5,7,9,11,13]

zip函數

  它的返回值是多個,若是是多個可迭代對象,按照最短的進行輸出,能夠將它戲稱爲拉鍊函數

lst = [1,2,3] lst1= [2,3,4,5,6] lst2 = [5,6,7,8] for i in zip(lst,lst1,lst2): print(i)                結果爲:(1,2,5),(2,3,6),(3,4,7)

reduce,實現累計算

python3中,導入reduce函數:from functools import reduce

lst = [1,2,3,4,5,6] print(reduce(lambda x,y:x**2,lst))   結果爲:120

其餘函數:

檢測可迭代對象:

  all( ),都爲真時,輸出True,有一個假就爲False

  any( ),有一個真即爲True

進制轉換:

  bin( ),把參數轉化成二進制

  otc( ),把參數轉化成八進制

  hex( ),把參數轉化成十六進制

和ascii碼相關:

  acsii( ),若是括號中元素在ascii碼中,就原生顯示;若是不在,就返回\u...

  chr( ),對應ascii碼,輸入位置字符找出對應字符

  ord( ),找帶字符位置的編碼

和數字運算相關:

  abs( ),求數字的絕對值

  round( ),四捨五入;第一個參數爲浮點數,第二個參數爲保留的位數

  pow( ),兩個參數是求冪運算,三個參數是求冪後再取餘

  max( ),求最大值;若是是字典,比較的是鍵

  min( ),求最小值

  float( ),浮點;

和字節相關:

  memoryview( ),求字節的內存地址

  bytes( ),查字節;第一個參數是要查詢的內容,第二個參數是編碼集

  bytearray( ),返回一個新字節數組,每一個元素的值的範圍是0~256對應的是ascii碼錶;第一個參數放內容,第二個參數是編碼集

 

callable( ),判斷是否可調用

repr( ),顯示數據的原生形態

如下兩個函數禁用:

eval( ),它能夠執行字符串中的部份內容,容易出問題

exec( ),不論字符串輸入什麼,均可以運行,更容易出問題

遞歸
  要知足的條件是:本身調用本身,是一個無止境的遞歸,必須得有明確的終止條件

def func(): print("你好") func() func()        會報錯,內存溢出

  官方聲明遞歸的最大深度爲1000,修改遞歸最大深度的方式是:sys.setrecursionlimit('修改的數量')

def func(n): print(n) n += 1 func(n) func(1)        實際測試在996-998之間

  遞歸主要應用在os模塊中,能夠遞歸建立文件夾,也能夠刪除,也能夠查看文件

相關文章
相關標籤/搜索