1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      python中如何使用裝飾器

      本篇文章為大家展示了python中如何使用裝飾器,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

      創(chuàng)新互聯(lián)公司是專業(yè)的墾利網(wǎng)站建設(shè)公司,墾利接單;提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行墾利網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

      帶參數(shù)裝飾器結(jié)構(gòu)

      大家都知道了裝飾器是用來(lái)拓展函數(shù)功能的,但是別忘了裝飾器本身也是函數(shù),當(dāng)然也可以通過(guò)給裝飾器增加參數(shù)來(lái)拓展功能。

      我們繼續(xù)昨天的案例講解帶參數(shù)裝飾器:現(xiàn)在客戶又提需求了,客戶發(fā)現(xiàn)周一到周五收銀機(jī)的帳目很清楚,但是周六日賬目有點(diǎn)混亂。客戶希望收銀機(jī)把周六和周日的所有交易記錄保存到日志文件中,周一到周五的交易記錄不需要保存。

      分析客戶需求,按照我們昨天學(xué)習(xí)的裝飾器的內(nèi)容,可以很快想到解決方案,再寫一個(gè)裝飾器用來(lái)保存交易記錄。但是這里有一個(gè)難點(diǎn),客戶要求周一至周五的不保存,周六周日的保存,怎么辦呢?

      在這里就需要用到帶參數(shù)裝飾器了,具體代碼如下:

      import functools
      from datetime import datetime
      # 這行代碼是獲取當(dāng)前是星期幾,周一對(duì)應(yīng)對(duì)應(yīng)1,周六對(duì)應(yīng)6,周日對(duì)應(yīng)7
      # day_week = datetime.now().isoweekday()  # 今天是周二,明天周三,不會(huì)觸發(fā)記錄日志的條件,暫注釋,方便測(cè)試
      day_week = 7  # 為了測(cè)試,假定今日是周日。實(shí)際使用時(shí)注釋這行,取消注釋上面一行。
      
      def check_week(chk):
          def inner(func):
              @functools.wraps(func)
              def inner_chk(*args, **kwargs):
                  if chk:
                      with open('log.txt', mode='a', encoding='utf8') as f:
                          f.write(f'交易記錄:折扣值是{args[0]},商品單價(jià){args[1]},商品數(shù)量{args[2]},交易時(shí)間是{datetime.now()}\n')
                  return func(*args, **kwargs)
              return inner_chk
          return inner
      
      def checkdisct(func):
          @functools.wraps(func)
          def inner(*args, **kwargs):
              disct = args[0]
              if disct >= 0.5 and disct <= 1:
                  print('折扣值合理!')
                  return func(*args, **kwargs)
              else:
                  print('折扣值不合理!')
          return inner
      
      def checkpwd(func):
          @functools.wraps(func)
          def inner(*args, **kwargs):
              pwd = input('請(qǐng)輸入密碼:')
              if pwd == "123456":
                  print("密碼正確!")
                  return func(*args, **kwargs)
              else:
                  print('密碼錯(cuò)誤!')
          return inner
      
      # 判斷不是星期六和日則設(shè)置day_week為0,不觸發(fā)記錄log;若是周六、周日會(huì)觸發(fā)記錄log。
      if day_week != 6 or day_week != 7:  
          day_week = 0
      
      @checkpwd
      @checkdisct
      @check_week(day_week)
      def count(x, prince, number):
          '''功能:計(jì)算商品應(yīng)付款和實(shí)付款的函數(shù)。
      參數(shù):x是float型,指定折扣額度;prince是float型,指定商品的單價(jià);number是int型,指定商品的數(shù)量。'''
          result = prince * number
          pay = result * x
          print(f'總價(jià)是{result}元,實(shí)付{pay}元')
      
      count(0.8, 2.88, 100)
      count(0.3, 2.88, 100)
      
      out:
      請(qǐng)輸入密碼:123456
      密碼正確!
      折扣值合理!
      總價(jià)是288.0元,實(shí)付230.4元
      請(qǐng)輸入密碼:1
      密碼錯(cuò)誤!

      python中如何使用裝飾器

      測(cè)試結(jié)果完全滿足客戶的需求,實(shí)現(xiàn)了周一至五不記錄交易log,周六日記錄交易log。

      帶參數(shù)裝飾器詳解

      直接讀上面大段代碼對(duì)于裝飾器運(yùn)用不熟練的朋友可能會(huì)有些懵懂,下面詳細(xì)講解帶參數(shù)裝飾器。

      帶參數(shù)裝飾器至少有3層結(jié)構(gòu),即最少包含3層def和3層return。

      1. 第一層:負(fù)責(zé)接收裝飾器自身的參數(shù),再返回第二層函數(shù)。

      2. 第二層:負(fù)責(zé)接收被裝飾的函數(shù),再返回第三層函數(shù)。

      3. 第三層:這一層做的事情很多,按功能劃分為3塊。

        1. 負(fù)責(zé)接收被裝飾函數(shù)的參數(shù)。

        2. 對(duì)裝飾器自身的參數(shù)進(jìn)行解析處理,若其滿足某條件則做某動(dòng)作,不滿足條件則不做動(dòng)作(或做別的動(dòng)作)。

        3. 返回被裝飾的函數(shù)及其參數(shù)。

      def check_week(chk):  # 帶參數(shù)裝飾器,chk是判斷條件,chk不是0則記錄交易日志,chk是0則不記錄
          def inner(func):  # func是被裝飾的函數(shù)名
              @functools.wraps(func)
              def inner_chk(*args, **kwargs):  # *args和**kwargs是被裝飾的函數(shù)參數(shù)
                  if chk:  #判斷條件是否滿足,若不為0則將交易記錄和交易時(shí)間保存到log.txt文件
                      with open('log.txt', mode='a', encoding='utf8') as f:  
                          f.write(f'交易記錄:折扣值是{args[0]},商品單價(jià){args[1]},商品數(shù)量{args[2]},交易時(shí)間是{datetime.now()}\n')
                  return func(*args, **kwargs)  # 返回被裝飾的函數(shù)及其參數(shù)
              return inner_chk  # 返回第三層函數(shù)inner_chk
          return inner  # 返回第二層函數(shù)inner

      以上案例詳細(xì)講解了帶參數(shù)裝飾器的構(gòu)造,要學(xué)習(xí)裝飾器必須多加練習(xí)才能真正掌握。

      帶參數(shù)裝飾器的運(yùn)用場(chǎng)景

      關(guān)于帶參數(shù)裝飾器的運(yùn)用場(chǎng)景有很多,比較常見(jiàn)的有是否記錄業(yè)務(wù)日志,是否生成性能日志,使用測(cè)試數(shù)據(jù)庫(kù)運(yùn)行或使用生產(chǎn)數(shù)據(jù)庫(kù)運(yùn)行等等,具體要因業(yè)務(wù)需求而定。

      裝飾器的補(bǔ)充運(yùn)用

      關(guān)于裝飾器的運(yùn)用,除了可以自己寫的裝飾器用,也有一些官方或第三方提供的裝飾器非常好用。例如之前有提及的@functools.wraps裝飾器。

      這里再補(bǔ)充一個(gè)numba的jit裝飾器,功能是通過(guò)即時(shí)編譯的方法提升python函數(shù)運(yùn)行效率。在涉及大量循環(huán)運(yùn)算的場(chǎng)合建議嘗試一下。以下是測(cè)試代碼。

      from numba import jit
      import time
      
      @jit
      def fib(n):
          if n <= 2:
              return 1
          else:
              return fib(n - 1) + fib(n - 2)
      
      start = time.time()
      print(fib(40))
      end = time.time()
      print(f"用時(shí):{end - start}秒")
      
      out:
      102334155
      用時(shí):1.001574993133545秒

      大家猜猜如果注釋掉@jit,運(yùn)行時(shí)間時(shí)間需要多少秒?

      python中如何使用裝飾器

      上述內(nèi)容就是python中如何使用裝飾器,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


      網(wǎng)頁(yè)標(biāo)題:python中如何使用裝飾器
      本文路徑:http://www.ef60e0e.cn/article/pgejji.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        小金县| 娱乐| 石渠县| 福泉市| 巴东县| 汾西县| 稻城县| 扶余县| 桑日县| 塘沽区| 大宁县| 无棣县| 连南| 三明市| 宁陵县| 东城区| 柳河县| 新邵县| 贵定县| 都江堰市| 汽车| 信丰县| 扶绥县| 灯塔市| 西宁市| 甘孜| 浦江县| 呼图壁县| 石棉县| 息烽县| 杭州市| 温宿县| 涞水县| 尉氏县| 凭祥市| 武义县| 留坝县| 兰考县| 中卫市| 开化县| 宝应县|