python筆記 一些常用的小trick(二)

2021-10-07 22:05:57 字數 3445 閱讀 6376

2. 生成器

3. 儲存列印結果

4. 參考文獻

裝飾器的概念有點類似於數學中的泛函,是函式的函式。其輸入引數為乙個方法,輸出為另乙個方法。

熟練地使用裝飾器,我們可以更好地對函式進行模組化操作,減少重複**量。

下面,我們來考察一下裝飾器的使用,具體包括以下內容:

裝飾器的一般用法

向裝飾器中傳入額外引數

給出裝飾器的基礎用法如下:

def

decorator

(func)

:def

(*args,

**kwargs)

: ret = func(

*args,

**kwargs)

print

(ret)

return ret

@decorator

defmy_func

(n):

return n*

(n+1)/

2myfunc(

100)

執行得到:

5050
要向裝飾器中傳入引數,在實現上只需要在裝飾器外部再包裝一層函式即可實現。

def

decorator

(log)

:def

_decorator

(func)

:def

(*args,

**kwargs)

:print

(log)

ret = func(

*args,

**kwargs)

print

(ret)

return ret

return _decorator

@decorator(

"=== 高斯求和 ==="

)def

my_func

(n):

return n*

(n+1)/

2myfunc(

100)

執行得到:

=== 高斯求和 ===

5050

生成器是python中的一種常用的優化效能的方法,其核心在於其計算是lazy的,每次只有當呼叫時才會進行相應的計算。通過這樣的方式,我們往往可以大大優化記憶體的使用,因為我們不需要一次性的將所有的計算內容全部計算完成並儲存到記憶體中了。

一種最為簡單的生成器實現方法為:

my_iter =

(i for i in

range(10

))type

(my_iter)

# generator

但是,在實際使用中,我們所需要的生成器內容往往會更為複雜,很難全部使用列表生成式進行寫作,更多的情況下,我們會將其寫在函式中,並通過yield方法進行實現。

其典型的生成器呼叫樣例如下:

def

my_iter

(n):

for i in

range

(n):

yield i

for i in my_iter(10)

:print

(i)

可以看到,生成器往往會與yield方法聯合使用,yield方法表示在執行到當前內容時直接返回後面的結果,並且在下一次呼叫這個函式時從下一行開始繼續執行。

如果不使用for迴圈,我們也可以通過下面的方式手動觸發生成器:

tmp = my_iter(10)

next

(tmp)

# 0next

(tmp)

# 1

不過需要注意的是,在使用next函式時,如果已經取完了生成器中的所有元素,那麼下一次呼叫next函式將會報錯,返回乙個stopiteration報錯提示。

python中的print方法事實上呼叫的是sys.stdout.write方法。

其**原則為如下形式:

import sys

defprint

(message, end=

"\n"):

sys.stdout.write(message + end)

return

因此,我們如果想要同步地將所有的print列印的日誌全部儲存在某乙個外部檔案中的話,可以使用下面兩種操作方法。

覆蓋print函式

這種方式的實現非常的暴力,只要重新複寫一下print函式即可:

log_file =

"./log.txt"

defprint

(message, end=

"\n"):

print

(message, end=end)

with

open

(log_file,

"a")

as fout:

fout.write(message + end)

return

print

("haha"

)

覆蓋stdout類

這種方法就是將print函式呼叫的sys.stdout.write()方法進行重寫,令其可以同時執行系統列印以及檔案日誌內容的列印。

給出一種實現方式如下:

import sys

class

logger

(object):

def__init__

(self, log_file_path=

'./log.txt'):

self.terminal = sys.stdout

self.log =

open

(log_file_path,

"a", encoding=

'utf8'

)def

write

(self, message)

: self.terminal.write(message)

self.log.write(message)

defflush

(self)

: self.terminal.flush(

)sys.stdout = logger(log_file_path=

"./log.txt"

)print

("haha"

)

廖雪峰python教程

python3 將print列印的內容儲存到日誌

python筆記 一些常用的小trick(一)

假設你git clone了乙個函式庫,然後想要在某一段 中呼叫其中的某乙個函式,請問你要怎麼做呢?這裡,我們來給出乙個這類函式的呼叫小trick。其實方法也比較簡單,一種簡單粗暴的方法就是把這個函式的路徑加入到系統的python path中,但是這種操作是永續的,在更多情況下,我們只是想要臨時在某些...

python 的一些筆記

1.模組的使用 在python中,模組內部使用的變數是通過字首 實現的。類似於 的變數是特殊變數,比如 author 2.類中的函式和普通的函式的不同點 類中的函式第乙個引數永遠是例項變數self,並且呼叫時不同傳遞該引數。3.在python中,類似於 的變數不是私有變數,私有變數是類似於 xx這樣...

更新一些常用的小軟體

這些都是平常用的一些小工具,怕丟失了 寫起來留個爪 tiny pdf 今天想找個工具把doc轉換成pdf,找了好幾個軟體,都不怎麼理想,最後看到這個260來k的小軟體,效果很好,使用 在控制面板中,開啟印表機與傳真,選定tiny pdf為預設印表機即可。然後開啟乙個word文件,直接列印,結果即為p...