中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python寫裝飾器

發布時間:2021-12-17 13:50:32 來源:億速云 閱讀:187 作者:iii 欄目:編程語言

這篇文章主要講解了“怎么用Python寫裝飾器”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用Python寫裝飾器”吧!

按照題目要求寫出對應的函數。

要求:寫一個函數,傳入一個有若干個整數的列表,該列表中某個元素出現的次數超過了50%,返回這個元素。

def more_than_half(items):
   temp, times = None, 0
   for item in items:
       if times == 0:
           temp = item
           times += 1
       else:
           if item == temp:
               times += 1
           else:
               times -= 1
   return temp

點評:LeetCode上的題目,在Python面試中出現過,利用元素出現次數超過了50%這一特征,出現和temp相同的元素就將計數值加1,出現和temp不同的元素就將計數值減1。如果計數值為0,說明之前出現的元素已經對最終的結果沒有影響,用temp記下當前元素并將計數值置為1。最終,出現次數超過了50%的這個元素一定會被賦值給變量temp。

按照題目要求寫出對應的函數。

要求:寫一個函數,傳入的參數是一個列表(列表中的元素可能也是一個列表),返回該列表最大的嵌套深度。例如:列表[1, 2, 3]的嵌套深度為1,列表[[1], [2, [3]]]的嵌套深度為3。

def list_depth(items):
   if isinstance(items, list):
       max_depth = 1
       for item in items:
           max_depth = max(list_depth(item) + 1, max_depth)
       return max_depth
   return 0

點評:看到題目應該能夠比較自然的想到使用遞歸的方式檢查列表中的每個元素。

按照題目要求寫出對應的裝飾器。

要求:有一個通過網絡獲取數據的函數(可能會因為網絡原因出現異常),寫一個裝飾器讓這個函數在出現指定異常時可以重試指定的次數,并在每次重試之前隨機延遲一段時間,最長延遲時間可以通過參數進行控制。

方法一:

from functools 
import wraps
from random import random
from time import sleep def retry(*, retry_times=3, max_wait_secs=5, errors=(Exception, )):

   def decorate(func):

       @wraps(func)
       def wrapper(*args, **kwargs):
           for _ in range(retry_times):
               try:
                   return func(*args, **kwargs)
               except errors:
                   sleep(random() * max_wait_secs)
           return None

       return wrapper

   return decorate

方法二:

from functools import wraps
from random import random
from time import sleep class Retry(object):

   def __init__(self, *, retry_times=3, max_wait_secs=5, errors=(Exception, )):
       self.retry_times = retry_times
       self.max_wait_secs = max_wait_secs
       self.errors = errors

   def __call__(self, func):

       @wraps(func)
       def wrapper(*args, **kwargs):
           for _ in range(self.retry_times):
               try:
                   return func(*args, **kwargs)
               except self.errors:
                   sleep(random() * self.max_wait_secs)
           return None

       return wrapper

點評:我們不止一次強調過,裝飾器幾乎是Python面試必問內容,這個題目比之前的題目稍微復雜一些,它需要的是一個參數化的裝飾器。

寫一個函數實現字符串反轉,盡可能寫出你知道的所有方法。

點評:爛大街的題目,基本上算是送人頭的題目。

方法一:反向切片

def reverse_string(content):
   return content[::-1]

方法二:反轉拼接

def reverse_string(content):
   return ''.join(reversed(content))

方法三:遞歸調用

def reverse_string(content):
   if len(content) <= 1:
       return content
   return reverse_string(content[1:]) + content[0]

方法四:雙端隊列

from collections import deque

def reverse_string(content):
   q = deque()
   q.extendleft(content)
   return ''.join(q)

方法五:反向組裝

from io 
import StringIO

def reverse_string(content):
   buffer = StringIO()
   for i in range(len(content) - 1, -1, -1):
       buffer.write(content[i])
   return buffer.getvalue()

方法六:反轉拼接

def reverse_string(content):
   return ''.join([content[i] for i in range(len(content) - 1, -1, -1)])

方法七:半截交換

def reverse_string(content):
   length, content= len(content), list(content)
   for i in range(length // 2):
       content[i], content[length - 1 - i] = content[length - 1 - i], content[i]
   return ''.join(content)

方法八:對位交換

def reverse_string(content):
   length, content= len(content), list(content)
   for i, j in zip(range(length // 2), range(length - 1, length // 2 - 1, -1)):
       content[i], content[j] = content[j], content[i]
   return ''.join(content)

擴展:這些方法其實都是大同小異的,面試的時候能夠給出幾種有代表性的就足夠了。給大家留一個思考題,上面這些方法,哪些做法的性能較好呢?我們之前提到過剖析代碼性能的方法,大家可以用這些方法來檢驗下你給出的答案是否正確。

按照題目要求寫出對應的函數。

要求:列表中有1000000個元素,取值范圍是[1000, 10000),設計一個函數找出列表中的重復元素。


def find_dup(items: list):
   dups = [0] * 9000
   for item in items:
       dups[item - 1000] += 1
   for idx, val in enumerate(dups):
       if val > 1:
           yield idx + 1000

感謝各位的閱讀,以上就是“怎么用Python寫裝飾器”的內容了,經過本文的學習后,相信大家對怎么用Python寫裝飾器這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彝良县| 宜良县| 巢湖市| 年辖:市辖区| 邹城市| 大洼县| 安西县| 巴塘县| 锡林浩特市| 崇州市| 夹江县| 玉溪市| 祁东县| 万源市| 贺州市| 嵩明县| 彭州市| 东海县| 平舆县| 泗洪县| 汝阳县| 德兴市| 兴宁市| 林口县| 卓尼县| 阜宁县| 宣汉县| 新泰市| 甘孜| 平遥县| 云安县| 苗栗市| 始兴县| 宜兰县| 胶州市| 日土县| 本溪市| 水富县| 巴楚县| 屯门区| 黄骅市|