遞迴函式和有參裝飾器

2022-10-09 02:51:07 字數 4381 閱讀 3094

'''語法糖會把緊挨著的被裝飾物件的名字當作引數自動傳入裝飾器函式裡面'''

# 判斷多個語法糖裝飾器函式執行順序

def outter1(func1):

print('載入了outter1')

res1 = func1(*args, **kwargs):

return res1

def outter2(func2):

print('載入了outter2')

def warpper2(*args, **kwargs):

res2 = func2(*args, **kwargs)

return res2

def ottuer(func3):

print('載入了oitter3')

def warpper3(*args, **kwarge):

print('執行了warpper3')

def login_auth(func_name): # 不能動 只能接收乙個被裝飾物件名字

def inner(*args, **kwargs): # 不能動 是專門用來給被裝飾的物件傳參的

username = input('username>>>:').strip()

password = input('password>>>:').strip()

# 資料的**不同 處理方式就不同 對應的**編寫就不一樣

# 分支結構處理 然後根據不同的引數提示 匹配不同的流程

if source_data == '1':

print('使用字典的方式處理資料')

elif source_data == '2':

print('使用列表的方式處理資料')

elif source_data == '3':

print('使用檔案操作處理資料')

else:

print('其他操作情況')

res = func_name(*args, **kwargs)

return res

return inner

return login_auth

"""函式名加括號 執行優先順序最高

@outer('3')

左側是語法糖結構 右側是函式名加括號結構

先執行函式呼叫 outer('3') 返回值是login_auth

在執行語法糖結構 @login_auth

發現最後還是乙個普通的裝飾器

有參裝飾器目的僅僅是給裝飾器傳遞額外的引數

裝飾器最多就三層巢狀

並且三層巢狀的結構使用頻率不高(最多是使用別人寫好的有參裝飾器)

from functools import wraps

@wraps(func_name)

"""@outer('3')

def index():

print('from index')

# 本質:遞迴函式也稱函式的遞迴

函式在執行過程中直接或者間接的呼叫了自身

# 基本演示

直接自己呼叫自己

def index():

print('from index')

index()

index()

"""maximum recursion depth exceeded while calling a python object

最大遞迴深度超出限制了 python直譯器自帶的應急機制

在有些程式語言中 甚至沒有遇警機制 **執行真的一致到計算機崩潰為止

"""'''這對python最大遞迴深度

回答997 998 1000都可以

官方給出的是1000

'''# 封裝函式

def get_age(n):

if n == 1:

return 18 # 有明確的結束條件

return get_age(n-1) + 2

print(get_age(4))

'''千萬不要想複雜了 就記巢狀圖即可 有結果就是由內而外一層層撥開'''

'''需求:迴圈列印出列表中每乙個數字'''

# 寫**之前一定要先理清思路

"""完整步驟

1.for迴圈大列表

2.判斷元素是否是數字 如果是則列印

3.如果不是則for迴圈

4.判斷元素是否是數字 如果是則列印

5.如果不是則for迴圈

6.判斷元素是否是數字 如果是則列印

7.如果不是則for迴圈

ps:重複做一些事情 但是每次都比上一次簡單一些 >>>: 遞迴函式

"""def get_num(l):

for i in l: # 自帶結束條件 並且每次傳入的資料都比上一次簡單

if isinstance(i,int): # 判斷某個資料是否屬於某個型別

print(i)

else:

get_num(i)

get_num(l1)

# 什麼是演算法

解決計算問題的有效方法

""" 演算法比較偏向於學術研究 很枯燥 並且產出很少

甚至只有非常大的網際網路公司才會有演算法部分

演算法工程師薪資待遇很高 但是產出很少

有時候甚至幾年都沒有任何的成果 有點類似於研究所!!!

"""# 二分法

前提是資料要有先後順序(公升序,降序)

l1 = [13,21,35,46,52,67,76,87,99,123,213,321,432,564,612]

# 查詢乙個數 123

"""二分法原理

獲取資料集中間的元素 比對大小

如果中間的元素大於目標資料 那麼保留資料集的左邊一半

如果中間的元素小於目標資料 那麼保留資料集的右邊一半

然後針對剩下的資料集再二分

如果中間的元素大於目標資料 那麼保留資料集的左邊一半

如果中間的元素小於目標資料 那麼保留資料集的右邊一半

..."""def get_target(l1,target_num):

# 最後要考慮找不到情況 l1不能無限制二分

if len(l1) == 0:

print('不好意思沒有該資料')

return

# 獲取中間值 整數

middle_index = len(l1) // 2

# 判斷資料的大小

if target_num > l1[middle_index]:

# 保留右側

l1_left = l1[middle_index + 1:]

# 重複二分

print(l1_left)

get_target(l1_left,target_num)

elif target_num < l1[middle_index]:

# 保留左側

l1_ringht = l1[:middle_index]

print(l1_ringht)

# 繼續二分法

get_target(l1_ringht,target_num)

else:

print('找到了',target_num)

get_target(l1,432)

get_target(l1,22)

get_target(l1,13)

"""二分法的缺陷

1.如果要找的元素就在資料集的開頭 二分更加複雜

2.資料集必須有順序

目前沒有最完美的演算法 都有相應的限制條件

""""""

以後面試的時候 可能會讓你手用python寫一些演算法

二分法 快排 插入 冒泡 堆排序

上述知識面試之前臨時抱佛腳即可 平時無需過多研究

裝飾器 有參裝飾器

有參裝飾器 是為裝飾器提供多樣功能選擇的實現提供的,實現原理是三層閉包。有參裝飾器的基本模板 def outter x defoutter1 func res func args,kwargs print x return res return return outter1 通過第三層進行傳值,使得...

有參裝飾器

import time current user def deco func if current user user 已經登陸過 res func args,kwargs return res user input username strip pwd input password strip i...

無參裝飾器函式和帶參裝飾器函式

python裝飾器 下邊幾個裝飾器帶引數和不帶引數例子詳解 我們都知道,python中函式是可以被當做引數進行傳遞的,所以最直接的裝飾器例項如下 def decorator func 裝飾器函式 print welcome func print end def test print hello wo...