亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

python進階

廖雪峰 移動開發工程師
難度中級
時長 3小時33分
學習人數
綜合評分9.20
575人評價 查看評價
9.6 內容實用
9.0 簡潔易懂
9.0 邏輯清晰
  • 任務

    請思考帶參數的@decorator,@functools.wraps應該放置在哪:

    def?performance(unit):
    ????def?perf_decorator(f):
    ????????def?wrapper(*args,?**kw):
    ???????????????
    ????????return?wrapper
    ????return?perf_decorator
    • ?不會了怎么辦

    • 注意@functools.wraps應該作用在返回的新函數上。

      參考代碼:

      import?time,?functools
      def?performance(unit):
      ????def?perf_decorator(f):
      [email protected](f)
      ????????def?wrapper(*args,?**kw):
      ????????????t1?=?time.time()
      ????????????r?=?f(*args,?**kw)
      ????????????t2?=?time.time()
      ????????????t?=?(t2?-?t1)?*?1000?if?unit=='ms'?else?(t2?-?t1)
      ????????????print?'call?%s()?in?%f?%s'?%?(f.__name__,?t,?unit)
      ????????????return?r
      ????????return?wrapper
      ????return?perf_decorator
      
      @performance('ms')
      def?factorial(n):
      ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1))
      print?factorial.__name__


    查看全部
  • 導入模塊math后為何引用sqrt時還要加math: math是包含各種函數或方法的模塊,若前面是import math, 引用模塊中的函數就要用格式math.sqrt()。 若想省略前面的模塊名,在前面導入時用from math import *


    記得調用數學函數時應該加入:import math

    然后平方根的三種表達方法別忘記。。。

    第一種調用math函數庫 ?? math.sqrt

    第二種調用內置函數庫 ? ?? pow(x,0.5)

    第三種直接利用** ? ? ? ? ?? x**0.5


    查看全部
  • 任務

    上一節的@performance只能打印秒,請給?@performace?增加一個參數,允許傳入's'或'ms':

    @performance('ms')
    def?factorial(n):
    ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1))
    • ?不會了怎么辦

    • 要實現帶參數的@performance,就需要實現:

      my_func = performance('ms')(my_func)

      需要3層嵌套的decorator來實現。

      參考代碼:

      import?time
      def?performance(unit):
      ????def?perf_decorator(f):
      ????????def?wrapper(*args,?**kw):
      ????????????t1?=?time.time()
      ????????????r?=?f(*args,?**kw)
      ????????????t2?=?time.time()
      ????????????t?=?(t2?-?t1)?*?1000?if?unit=='ms'?else?(t2?-?t1)
      ????????????print?'call?%s()?in?%f?%s'?%?(f.__name__,?t,?unit)
      ????????????return?r
      ????????return?wrapper
      ????return?perf_decorator
      
      @performance('ms')
      def?factorial(n):
      ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1))
      print?factorial(10)


    查看全部
  • 任務

    請編寫一個@performance,它可以打印出函數調用的時間。

    • ?不會了怎么辦

    • 計算函數調用的時間可以記錄調用前后的當前時間戳,然后計算兩個時間戳的差。

      參考代碼:

      import?time
      def?performance(f):
      ????def?fn(*args,?**kw):
      ????????t1?=?time.time()
      ????????r?=?f(*args,?**kw)
      ????????t2?=?time.time()
      ????????print?'call?%s()?in?%fs'?%?(f.__name__,?(t2?-?t1))
      ????????return?r
      ????return?fn
      
      @performance
      def?factorial(n):
      ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1))
      print?factorial(10)


    查看全部
  • 任務

    利用匿名函數簡化以下代碼:

    def?is_not_empty(s):
    ????return?s?and?len(s.strip())?>?0
    filter(is_not_empty,?['test',?None,?'',?'str',?'??',?'END'])
    • ?不會了怎么辦

    • 定義匿名函數時,沒有return關鍵字,且表達式的值就是函數返回值。

      參考代碼:

      print?filter(lambda?s:?s?and?len(s.strip())>0,?['test',?None,?'',?'str',?'??',?'END'])


    查看全部
  • #?希望一次返回3個函數,分別計算1x1,2x2,3x3:def?count():
    ????fs?=?[]
    ????for?i?in?range(1,?4):
    ????????def?f():
    ?????????????return?i*i
    ????????fs.append(f)
    ????return?fs
    
    f1,?f2,?f3?=?count()

    你可能認為調用f1(),f2()和f3()結果應該是1,4,9,但實際結果全部都是?9(請自己動手驗證)。

    原因就是當count()函數返回了3個函數時,這3個函數所引用的變量 i?的值已經變成了3。由于f1、f2、f3并沒有被調用,所以,此時他們并未計算 i*i,當 f1 被調用時:

    >>>?f1()
    9?????#?因為f1現在才計算i*i,但現在i的值已經變為3

    因此,返回函數不要引用任何循環變量,或者后續會發生變化的變量。

    任務

    返回閉包不能引用循環變量,請改寫count()函數,讓它正確返回能計算1x1、2x2、3x3的函數。

    • ?不會了怎么辦

    • 考察下面的函數?f:

      def?f(j):
      ????def?g():
      ????????return?j*j
      ????return?g

      它可以正確地返回一個閉包g,g所引用的變量j不是循環變量,因此將正常執行。

      在count函數的循環內部,如果借助f函數,就可以避免引用循環變量i。

      參考代碼:

      def?count():
      ????fs?=?[]
      ????for?i?in?range(1,?4):
      ????????def?f(j):
      ????????????def?g():
      ????????????????return?j*j
      ????????????return?g
      ????????r?=?f(i)
      ????????fs.append(r)
      ????return?fs
      f1,?f2,?f3?=?count()
      print?f1(),?f2(),?f3()


    查看全部
    0 采集 收起 來源:python中閉包

    2020-07-14

  • reduce()函數

    可以定義一個函數,該函數為一組規則,然后通過reduce()函數來調用這個規則,去處理list

    參數:reduce可以接收三個參數,第一個為處理函數
    處理函數接受兩個參數
    第二個參數為待處理的數據,是一個list,可以是
    任意數據類型的list
    第三個參數是可選的,是一個初始值
    def?f(x,y)?:
    ???return?規則
    ?print(reduce(規則函數名,list,[初始值]))
    查看全部
  • 這里的S[0].upper,意思不是把S這個列表里的第一個值大寫嗎?就是把['adam', 'LISA', 'barT']中的adam全部大寫? --------------------------------------------? 不是的,map函數中接受的函數是作用在list中的每一個元素上,所以map函數中接受的f的自變量是list中的每一個元素,因此def時候的format_name(s)的s指代的是list中的每一個元素,也就是字符串,而不是整個list。s[0]就是s字符串的第一個字母。

    查看全部
  • 關鍵字lambda?表示匿名函數,冒號前面的?x 表示函數參數。

    匿名函數有個限制,就是只能有一個表達式,不寫return,返回值就是該表達式的結果。


    查看全部
  • 實例賦值:xiaoming.name = '';實例的屬性可以像普通變量一樣進行操作。

    查看全部
  • 類關鍵字:class,類名以大寫字母開頭緊接著(object)表示該類是從哪個類繼承下來的;創建實例用類名+()

    eg:

    class? Person(object):

    ????pass

    查看全部
  • 類(class)用于定義抽象類型,實例根據類的定義被創建出來

    查看全部
  • 試用某一新特性通過導入__future__模塊的某些功能來實現。

    新版本與舊版本不兼容在舊版本中添加到_future_中便于舊代碼在舊版本中測試

    查看全部
  • 導入動態模塊:

    try:

    ????from cStringIO? import? StringIO

    except? ImportError:

    ????from StringIO import StringIO

    try的作用是捕獲錯誤,并在捕獲到指定錯誤時執行except語句。

    import...as...可以動態導入不同名稱的模塊

    查看全部
  • 導入模塊:import??

    導入模塊中的某幾個函數: form math import pow,sin

    導入函數防止沖突 給函數重命名: from math import log as logger? 此時log函數變成logger

    查看全部

舉報

0/150
提交
取消
課程須知
本課程是Python入門的后續課程 1、掌握Python編程的基礎知識 2、掌握Python函數的編寫 3、對面向對象編程有所了解更佳
老師告訴你能學到什么?
1、什么是函數式編程 2、Python的函數式編程特點 3、Python的模塊 4、Python面向對象編程 5、Python強大的定制類

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!