1. 程式人生 > >裝飾器及內建函式

裝飾器及內建函式

裝飾器

聽名字應該知道這是一個裝飾的東西,我們今天就來講解一下裝飾器,有的鐵子們應該聽說,有的沒有聽說過.沒有關係我告訴你們這是一個很神奇的東西

這個有多神奇呢? 我們先來複習一下閉包

def func1():
​
    name = "alex"
​
    def func2():
​
        print(name)
​
        # 閉包
​
    func2()
​
func1()  

這就是閉包,那剛剛說的很神奇的東西呢?,為什麼又說閉包了呢? 機智的鐵子們已經猜到,裝飾器和閉包是有點關係的,是滴沒錯.

那什麼是裝飾器呢?裝飾器是幹什麼的呢?

裝飾器的本質其實就是閉包

現在你在公司,領導讓你寫一個函式,來測試另一個函式的執行效率,你怎麼做?

我先告訴大家一個檢視時間的東西

time.time() 獲取都是一個字串

我們可以通過這個來計算執行時間

def func():      print( '嘻嘻更健康' ) import time start_time = time.time() time.sleep(0.1)
func() end_time = time.time() print( '----> 執行效率%s' %(end_time - start_time))

上面你已經寫完了,但是你應該放在函式中,這樣減少重複程式碼,可讀性好,ok繼續做。

def func():      print( '嘻嘻更健康' ) def timmer(f):
     start_time = time.time()      time.sleep(0.1)      f()      end_time = time.time()      print( '----> 執行效率%s' %(end_time - start_time))

好你又寫完了,但是執行之前的函式只是func(),而你寫玩了這個之後,還得加一步timmer(func),如果要是領導讓你測試500個函式的執行效率呢?好,你又進一步改,如下

func() f1 = func  # func func = timmer  # timmer func(f1) 將他的執行結果改了一下,這樣看似func(f1)與原來的呼叫差不多,但是加了好幾步,而且添加了f1引數

現在你請教了我,我說來,寫個裝飾器就能解決。

def timmer(f):      def inner():          start_time = time.time()          time.sleep(0.1)          f()          end_time = time.time()          print( '----> 執行效率%s'  % (end_time - start_time))      return  inner func = timmer(func)  # inner func() # inner()

這樣,就寫好了,這是最簡單的裝飾器,裝飾任何函式,只需要加一句func = timmer(func)

#簡單的裝飾器 def func():      print( '嘻嘻更健康' ) def timmer(f):      def inner():          start_time = time.time()          time.sleep(0.1)          f()          end_time = time.time()          print( '----> 執行效率%s'  % (end_time - start_time))      return  inner func = timmer(func)  # inner func() # inner()

但是Python認為你這個還是不簡單,所以Python給你提供了一個更見的方式就是語法糖。

#語法糖 @  def timmer(f):      def inner():          start_time = time.time()          time.sleep(0.1)          f()          end_time = time.time()          print( '----> 執行效率%s'  % (end_time - start_time))      return  inner @timmer  # func = timmer(func) 語法糖的用意
@裝飾器函式 == 重新定義被裝飾函式=裝飾器函式(被裝飾函式)
def func():      print( '嘻嘻更健康' ) func() # inner()

內建函式

什麼是內建函式?就是python幫我們提供的一個工具,拿過直接用就行,比如我們的print,input,type,id等等.截止到python3.6.2版本

中一共提供了68個內建函式.他們就是python直接提供給我們的,有一些我們已經用過了.有一些還沒有用過.還有一我們需要學完面向物件才能繼續學習.今天我們認識一下python的內建函式

作用域相關

  locals() 返回當前作用域中的名字

  globals() 返回全域性作用域中的名字

迭代器相關

  range() 生成資料

  next() 迭代器向下執行一次,內部實際使用了next()方法返回迭代器的下一個專案

  iter() 獲取迭代器,內部實際使用的是iter()方法來獲取迭代器

字串型別程式碼的執行

eval() 執行字串型別的程式碼,並返回最終結果

print(eval( '2+8' )) 結果: 10 n = 8 print(eval( 'n + 10' )) 結果: 18

exec() 執行字串型別的程式碼 

exec( '' ' for  in  range(10):      print(i) '' ') # 我們按照python能夠識別的語法寫程式碼,這次寫入的是字串也可以執行 exec( '' ' def func():      print( "444" ) func()    '' ') 結果: 444  

通過上邊的測試發現,只要是exec就沒有返回值,eval就是有返回值的 

輸入和輸出相關

  input() 獲取使用者輸入的內容

  print() 列印 輸出

print裡的sep

print( 'alex' , 'wusir' , 'baoyuan' ) print( 'alex' , 'wusir' , 'baoyuan' ,sep= '|' ) # 結果: # alex wusir baoyuan # alex|wusir|baoyuan print預設sep是一個空格,咱們打印出來的是以空格分開的,我們修改了sep打印出來的就是以管道符分開的

print裡的end

print( 'alex' ) print( 'alex' ) print( 'alex' ) # 結果: # alex # alex # alex print( 'alex' ,end= '' ) print( 'alex' ,end= '' ) print( 'alex' ,end= '' ) # 結果: # alexalexalex print 預設end是一個\n,打印出來的效果是有換行功能,咱們改成空字串,打印出來的效果就是一行顯示

記憶體相關

  hash() 獲取物件的雜湊值(int.str,bool,tuple)

print(hash((1,2,4))) print(hash( '你好' )) print(hash(111)) print(hash(False))

  id() 獲取到物件的記憶體地址

name =  'alex' print(id(name)) 結果:2376700908072

檔案操作相關

  open() 用於開啟一個檔案,建立一個檔案控制代碼

模組相關

import() 匯入,引入

import time print(time.time())

幫助

  help() 函式用於檢視函式或模組用途的詳細說明

help(input) 結果: Help  on  built- in  function input  in  module builtins: input(prompt=None, /)      Read a  string  from  standard input.  The trailing newline  is  stripped.            The prompt  string if  given,  is  printed to standard output without a      trailing newline before reading input.            If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.      On *nix systems, readline  is  used  if  available.

呼叫相關

  callable() 用於檢查一個物件是否是可呼叫的,如果返回True,object有可能呼叫失敗,要是返回False,那呼叫絕對就完犢子

def func():      pass name =  'meet' print(callable(func))  結果 True print(callable(name))  結果 Fasle

檢視記憶體屬性

  dir() 檢視物件的內建屬性,方法,訪問的是物件的dir()方法

print(dir(input)) # 結果: # ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

數字相關:  

  bool() 將給定的資料轉換成bool值,如果不給值.返回False

print( bool ()) 結果: False

  int() 將給定的資料轉換成int值,如果不給值,返回0

print( int ()) 結果: 0

 float() 將給定的資料轉換成float值,也就上次小數

print( float ()) 結果: 0.0

  compilex() 建立一個複數,第一個引數為實部,第二個引數為虛部.或者第一個引數直接用字串來描述複數

print(complex(120)) 結果: 120+0j

進位制轉換:

  bin() 將給的引數轉換成二進位制

  otc() 將給的引數轉換成八進位制

  hex() 將給的引數轉換成十六進位制

數字運算:

  abs() 求絕對值

print(abs(-100)) 結果: 100  

  divmod() 返回商和餘數

print(divmod(20,6)) 結果: (3, 2)
第一個引數是商,第二引數是餘數

  round() 四捨五入

print(round(3.56)) 結果: 4 print(round(3.56,1)) 結果: 3.6 後邊的引數是指定小數點後邊的數字進行四捨五入,咱們指定的數字要小於咱們小時候點後邊的位數

  pow(a,b) 求a的b次冪,如果有個三次引數,則求萬次冪後對第三方個數取餘

print(pow(2,4)) 結果: 16 print(pow(2,4,3)) 結果: 1 三個引數 前來個引數是求2的3次冪,第三個引數是這個總和去除3然後獲取的是餘數

  sum() 求和

print(sum([1,2,3,4,5])) 結果: 15   引數必須是可迭代物件   min() 求最小值   print(min([1,2,3,4,5])) 結果: 1    引數必須是可迭代物件

  max() 求最大值

print(max([1,2,3,4,5])) 結果: 5    引數必須是可迭代物件

資料結構相關

列表和元祖

  list() 將一個可迭代物件轉換成列表

  tuple() 將一個可迭代物件轉換成元祖

  reversed() 將一個序列反轉,返回反轉序列的迭代器

print(list(reversed( '你好啊' ))) 結果: [ '啊' '好' '你' ]

字串相關:

  str() 將資料轉化成字串

  format() 與具體數相關,用於計算各種小數,精算等

字串

# 字串 # print(format('meet','<20'))   #左對齊 # print(format('meet','>20'))   #右對齊 # print(format('meet','^20'))   #居中 結果: meet                                 meet          meet

數值 自己練習

#數值 print(format(3, 'b' ))    # 二進位制 print(format(97, 'c' ))   # 轉換成unicodezif print(format(11, 'd' ))   #十進位制 print(format(56))       #和d一樣 print(format(11, 'n' ))   #十進位制 print(format(11, 'o' ))   #八進位制 print(format(11, 'x' ))  # 十六進位制(小寫字母) print(format(11, 'X' ))  # 十六進位制(大寫字母) # 浮點數 print(format(1234567890, 'e' ))  #科學計演算法,預設使用6位 print(format(123456789, '0.2e' ))# 科學計算,保留2位小數(小寫) print(format(123456789, '0.2E' ))# 科學計算,保留2位小數(大寫) print(format(1.23456789, 'f' )) #小數點計數法,保留6位小數 print(format(1.23456789, '0.2f' )) # 小數點計數法,保留2位數 print(format(1.23456789, '0.10f' )) # 小數點計數法,保留2位數 print(format(1.23456789e+1000, 'F' )) # 小數點計數法

bytes() 把字串轉換成bytes型別

s =  '你好武大' bs = s.encode( 'utf-8' ) print(bs) 結果:b '\xe4\xbd\xa0\xe5\xa5\xbd\xe6\xad\xa6\xe5\xa4\xa7' s1 = bs.decode( 'utf-8' ) print(s1) 結果: 你好武大 bs = bytes(s,encoding= 'utf-8' ) print(bs) 結果: b '\xe4\xbd\xa0\xe5\xa5\xbd\xe6\xad\xa6\xe5\xa4\xa7' 把字串編碼成utf-8

bytearray() 返回一個新位元組陣列,每個元素的值的範圍是0~256對應的是ascii碼錶

ret = bytearray( 'meet' ,encoding= 'utf-8' ) print(ret) print(ret[0]) 結果: bytearray(b 'meet' ) 109

memoryview() 檢視bytes的記憶體地址

s = memoryview( '麻花藤' .encode( 'utf-8' )) print(s) # 結果: # <memory at 0x000001F332E0E288>

ord() 輸入字元找帶字元編碼的位置

print(ord( 'a' )) print(ord( '中' )) print(ord( '國' )) 結果: 97 20013 22269 對應的是當前編碼 

chr() 輸入位置數字找出對應的字元

print(chr(97))  # 找到對應位置的字元 print(chr(20013))  # 找到對應位置的字元 # 結果: a

ascii() 是ascii碼中的返回值 不是就返回\u

print(ascii( 'a' ))  判斷字串在不在ascii碼錶中 print(ascii( '中' ))  結果: 'a' '\u4e2d'      如果不存在就返回\u...

repr() 返回一個物件本質的形式

name =  'alex' print(repr(name))   #返回這個物件本質的表示形式 結果: 'alex' name =  '我叫%r' print(name% 'meet' )   %r 用的就是repr 結果: 我叫 'meet'

資料集合

  dict() 建立一個字典

d = dict(k= 'v' ,key1= 'v2' ) print(d) 結果: { 'k' 'v' 'key1' 'v2' }

  set() 建立一個集合

s =  set ([1,2,4,5,6]) print(s) 結果: {1, 2, 4, 5, 6}

其他相關

  len() 返回一個物件的元素個數

  enumerate() 獲取列舉物件

lst = [ 'alex' , 'wusir' , 'taibai' ] for  i,k  in  enumerate(lst):      print( '這是序號' ,i)      print( '這是元素' ,k)

all() 可迭代物件中全部是True,結果才是True

lst = [1,2,3,4,True,0,False] lst1 = [1,2,3,4,True] print(all(lst)) print(all(lst1)) 結果: False True

any() 可迭代物件中有一個是True,就是True 

lst = [1,2,3,4,True,0,False] lst1 = [1,2,3,4,True] print(any(lst)) print(any(lst1)) 結果: False True

zip() 函式用於將可迭代的物件作為引數,將物件中對應的元素打包成一個個元祖,

然後返回由這些元祖組成的內容,如果各個迭代器的元素個數不一致,則按照長度最短的返回

lst1 = [1,2,3] lst2 = [ 'a' , 'b' , 'c' , 'd' ] lst3 = (11,12,13,14,15) for  in  zip(lst1,lst2,lst3):      print(i) 結果: (1,  'a' , 11) (2,  'b' , 12) (3, 

相關推薦

裝飾函式

裝飾器 聽名字應該知道這是一個裝飾的東西,我們今天就來講解一下裝飾器,有的鐵子們應該聽說,有的沒有聽說過.沒有關係我告訴你們這是一個很神奇的東西 這個有多神奇呢? 我們先來複習一下閉包 def func1(): ​ name = "alex" ​ def func2(): ​

函式進階四(裝飾函式)

一. 昨日內容回顧生成器,本質就是迭代器,自己用Python程式碼構建的迭代器1.生成器函式(yield)2.生成器表示式(i for i in range(21))生成器物件:gentor next(gentor) send(gentor) for 迴圈yield 與 return 的區別send: 給上一

python 學習彙總52:迭代常用函式map,filter,zip,reduce(入門學習- tcy)

迭代器常用內建函式 2018/9/15 1.內建函式 map(function, iterA, iterB, ...) ->iterator #建立迭代器等同於itertools.starmap(); filter(function,iterable) ->i

匿名函式函式

1 匿名函式python 使用 lambda 來建立匿名函式語法:lambda [arg1 [,arg2,.....argn]]:expressionlambda 只是一個表示式,函式體比 def 簡單很多。 lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lam

JavaScript 的定時物件

定時器 (1)setInterval();迴圈定時器:固定時間間隔指定一次,像鬧鐘 一樣,不關閉繼續執行。 (2)setTimeout();炸彈定時器:只執行一次,不能執行下一次了。 1. SetInterval() 語法結構: setInterval(code,millisec,lan

python(四)上:列表生成式、生成器、迭代函式

目錄 列表生成式 生成器 迭代器 內建函式 一、列表生成式 列表生成式即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的生成式。 舉個例子,要生成list [1, 2, 3, 4, 5, 6,

函式裝飾

內建函式補充 callable()   #檢測一個東西能否被呼叫 def f1():     pass f2 =123 print(callable(f1)) print(callable(f2)) # chr() 數字

20181130(裝飾補充,疊加多個裝飾,有參裝飾,三元表示式,生成式,匿名函式函式

  一、裝飾器的補充 1、函式屬性的傳遞 Python裝飾器(decorator)在實現的時候,被裝飾後的函式其實已經是另外一個函數了(函式名等函式屬性會發生改變),為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decora

day 12 函式裝飾,遞迴函式

內建函式 內建函式:python給咱們提供了一些他認為你會經常用到的函式,68種      內建函式     abs() dict() help() m

裝飾/函式

裝飾器:         def wrapper(f):             def inner(*a

python3_函式__全部內函式使用_all/repr/bytearray/exec/compile/filter/map/format/property

1.內建函式列表如下:   內 置 函 數 abs() dict() help() min() setattr()

GLSL(著色語言)中的函式

x*y: 如果x和y都是向量,那麼該運算子進行的是逐分量的相乘計算;如果是矩陣相乘,那麼該運算子會返回一個線性相乘(線性代數中正常的矩陣乘法)的矩陣,而不是一個逐分量的相乘結果(如果想得到的是逐分量的相乘結果,那就需要使用matrixCompMult函式)。 dot(x,y

大資料入門教程系列之Hive函式自定義函式

本篇文章主要介紹Hive內建函式以及自定義UDF函式和UDFT函式,自定義UDF函式通過一個國際轉換中文的例子說明。 操作步驟: ①、準備資料和環境 ②、演示Hive內建函式 ③、自定義UDF函式編寫、演示   詳細步驟: 一、準備資料和

python學習(十七)——補充函式、使用迭代協議實現斐波那契數列、描述符、pycharm的問題

一、補充內建函式 #--------------------------isinstance/isinbclass-------------- class Foo: pass class Bar(Foo): pass b1=Bar() print(isinstance(b1,

[Python3] 函式修飾@property

為什麼要使用@property 需求如下: 我們希望對一個成員屬性的訪問加以限制,按照常規思路是寫一個或多個訪問函式來實現訪問修改等操作 如果我們仍然想通過屬性(變數)名來訪問屬性可不可以呢 答案是可以的,這裡Python提供了了一種很神奇的方案,名為@p

Numpy 函式基本統計功能

a=np.arange(6) np.cos(a) np.exp(a) np.sqrt(a) 基本統計功能 a=np.random.randint(1,5,6) a.sum() a.mean()平均值 a.std()方差 a.min()最小值 a.max()

python函式匿名函式

locals  本地作用域/區域性作用域 會隨著位置的改變而改變globals 全域性作用域           永遠不變 永遠是全域性 a = 1 b = 2 print(locals())

Python函式總結詳解

………………吧啦吧啦……………… 2個多月來,將3.5版本中的68個內建函式,按順序逐個進行了自認為詳細的解析。為了方便記憶,將這些內建函式進行了如下分類: 數學運算(7個) 型別轉換(24個) 序列操作(8個) 物件操作(7個) 反射操作(8個) 變數操

Hive 函式自定義函式

1.內建函式 使用如下命令檢視當前hive版本支援的所有內建函式 show functions; 部分截圖: 可以使用如下命令檢視某個函式的使用方法及作用,比如檢視 upper函式 desc function upper; 如果想要檢

python編碼獲取排列組合的全部情況數Python函式獲取排列組合

def permutations(iterable, r=None): # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC # permutations(range(3))