Python之遞迴函式與裝飾器

2021-10-16 17:09:31 字數 3095 閱讀 9835

遞迴函式

在函式內部,可以呼叫其他函式。如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。

遞迴函式特性:

必須有乙個明確的結束條件;

每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少

相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入)。

遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)

遞迴的含義:

遞迴本身就是函式自己調自己,

舉乙個典型的例子:

計算1到100之間相加之和;通過遞迴兩種方式實現

def sum(max):

if max <= 100 and max >= 0:

return max +sum(int(max) - 1)

else:

return 0

print(sum(100))

下面是通過檔案和封裝函式來實現遞迴

import os#需要#用os模組開啟sys python系統

def func(path):#裡面放的是引數-->變數

#開啟這個資料夾-- 拿裡面的檔案的名字

lst=os.listdir('a')

for name in lst#拿到每個檔案的名字

#判斷name對應的檔案是資料夾還是檔案

#獲取到檔案所在的路徑

real_path=os.path.join(path,name)

if os.path.isdir(real_path):#判斷是否是資料夾,需要把檔案路徑扔進去

func(real_path)

else:

print(name)

func('a')#遞迴函式呼叫

python中的時間模組
python 中有乙個 time 模組可以用於獲取當前時間戳:

import time

time1 = time.time() # 每個時間戳都以自從2023年1月1日午夜(曆元)經過了多長時間來表示,單位是秒

x = 10*10

time2 = time.time()

print(time2-time1) # 表示執行 x = 10*10 所用的時間

裝飾器
def outer(x):

def inner(y):

return x + y

return inner # 這就是乙個閉包函式

print(outer(6)(5)) # 第乙個引數是傳給outer函式的,第二個傳給inner函式

執行結果:

11
如**所示,在 outer 函式內,又定義了乙個 inner 函式,並且 inner 函式又引用了外部函式 outer 的變數 x,這就是乙個閉包了。

裝飾器是閉包的一種應用,從字面上理解,就是裝飾物件的器件,其實裝飾器本質上就是乙個函式,功能是為其他函式新增功能,可以在不修改原有**的情況下,為被裝飾的物件增加新的功能或者附加限制條件或者幫助輸出。

當我們不使用裝飾器時:

def a(func):

def b():

print("我是附加功能1!") # 附加功能

func()

print("我是附加功能2!") # 附加功能

return b

def c():

print("我是函式原來的功能!")

res=a(c)

res()

執行結果:

我是附加功能1!

我是函式原來的功能!

我是附加功能2!

當我們使用裝飾器時:

def a(func):     # func 表示乙個函式

def b():

print("我是附加功能1!") # 附加功能

func() # 呼叫傳入的函式

print("我是附加功能2!") # 附加功能

return b

@a # @函式名 表示使用裝飾器

def c():

print("我是函式原來的功能!")

c()

執行結果:

我是附加功能1!

我是函式原來的功能!

我是附加功能2!

使用裝飾器後,@a等價於不使用裝飾器**中的res=a(c)。當被裝飾的函式需要傳入引數時,裝飾器的巢狀函式就需要新增乙個引數。

def a(func):

def b(x): # 新增乙個引數

print("我是附加功能1!") #附加功能

func(x)

print("我是附加功能2!") #附加功能

return b

@adef c(x):

print("我是函式原來的功能!%s"%x)

c('hello action!')

執行結果:

我是附加功能1!

我是函式原來的功能!hello action!

我是附加功能2!

除了被裝飾的函式可以新增引數之外,裝飾器也是可以新增引數的。

def a(x):

def b(func):

def c(y):

func(y)

print(x)

return c

return b

@a('hello')

def d(x):

print(x)

d('你好!')

執行結果:

你好!

hello

python之裝飾器 函式

1.裝飾器 遵循的原則 開閉原則 對功能的擴充套件開放 對 的修改是封閉 通用裝飾器寫法 存在的意義 在不破壞原有函式和原有函式呼叫的基礎上,給函式新增新的功能.fn是目標函式 def inner args,kwargs 為了目標函式的傳參 在執行目標函式之前 ret fn args,kwargs ...

高階函式與裝飾器函式python

高階函式是在python中乙個非常有用的功能函式,所謂高階函式就是乙個函式可以用來接收另乙個函式作為引數,這樣的函式叫做高階函式。map map 是 python 內建的高階函式,它接收乙個函式function 和乙個 list,並通過把函式 function 依次作用在 list 的每個元素上,得...

python如何裝飾遞迴函式

裝飾函式printtime 列印遞迴函式執行時間 def printtime func wraps func def args,kwargs start time print func args,kwargs end time print spent time s end start 遞迴函式n d...