python筆記13

来源:https://www.cnblogs.com/cuiyongchao007/archive/2020/02/07/12275107.html
-Advertisement-
Play Games

今日內容 裝飾器 推導式 模塊【可選】 內容回顧 1. 函數 參數 def (a1,a2):pass def (a1,a2=None):pass 預設參數推薦用不可變類型,慎用可變類型。 def( args, kwargs):pass 註意:位置參數 關鍵字參數 面試題 函數可以做參數【知識點】。 ...


今日內容

  • 裝飾器
  • 推導式
  • 模塊【可選】

內容回顧

  1. 函數
  • 參數
    • def (a1,a2):pass
    • def (a1,a2=None):pass 預設參數推薦用不可變類型,慎用可變類型。
    • def(*args,**kwargs):pass
    • 註意:位置參數 > 關鍵字參數
    • 面試題
      • 函數可以做參數【知識點】。
        def func(arg):
        arg()
        def show():
        pass
        func(show)
      • 函數的參數傳遞的是什麼?【記憶體地址=引用 or 值】
        v = [11,2,33,4]

        def func(arg):
            print(id(arg)) # 列表記憶體地址
        
        print(id(v)) # 列表記憶體地址
        func(v)
        
        # 傳遞的是記憶體地址。
      • *args和**kwargs的作用
  • 返回值
    • 常見數據類型可以返回
    • 函數也可以返回
      def func():
      def inner():
      pass
      return inner

      v = func()
    • 特殊
      • 預設沒返回就是None
      • return 1,2,3 等價於 return (1,2,3,4,)
  • 執行函數
    • 函數不被調用,內部代碼永遠不執行。
      def func():
      return i
      func_list = []
      for i in range(10):
      func_list.append(func)

      print(i) # 9
      v1 = func_list[4]()#9
      v2 = func_list[0]()#9
      func_list = []
      for i in range(10):
          # func_list.append(lambda :x) # 函數不被調用,內部永遠不執行(不知道是什麼。)
          func_list.append(lambda :i) # 函數不被調用,內部永遠不執行(不知道是什麼。)
      
      print(func_list)#列表,10個函數的記憶體地址。
      
      print(func_list[2]())#9
    • 執行函數時,會新創建一塊記憶體保存自己函數執行的信息 => 閉包
      def base():
      return i

      def func(arg):
          def inner():
              return arg
          return inner
      
      base_list = [] # [base,base,]
      func_list = [] # [由第一次執行func函數的記憶體地址,內部arg=0 創建的inner函數,有arg=1的inner函數 ]
      for i in range(10): # i = 0 ,1
          base_list.append(base)
          func_list.append(func(i))
      
      # 1. base_list 和 func_list中分別保存的是什麼?
      """
      base_list中存儲都是base函數。
      func_list中存儲的是inner函數,特別要說的是每個inner是在不同的地址創建。
      """
      # 2. 如果迴圈列印什麼?
      for item in base_list:
          v = item() # 執行base函數
          print(v) # 都是9
      for data in func_list:
          v = data()
          print(v) # 0 1 2 3 4 。在for迴圈過程中,func(i)已經執行,for迴圈過程中i的變化值已經被包在其中。

總結:

  • 傳參:位置參數 > 關鍵字參數
  • 函數不被調用,內部代碼永遠不執行。
  • 每次調用函數時,都會為此次調用開闢一塊記憶體,記憶體可以保存自己以後想要用的值。
  • 函數是作用域,如果自己作用域中沒有,則往上級作用域找。
  1. 內置和匿名函數(精英)
  • 內置函數
  • 匿名函數
  1. 模塊
  • getpass
  • random
  • hashlib

內容詳細

  1. 作業題講解

2.裝飾器

v = 1
v = 2 
# ########################
def func():
    pass 
v = 10
v = func

# ##########################
def base():
    print(1)

def bar():
    print(2)

bar = base
bar()

def func():
    def inner():
        pass
    return inner 

v = func()
print(v) # inner函數
# #########################################
def func(arg):
    def inner():
        print(arg)
    return inner 

v1 = func(1)
v2 = func(2)

print(v1,v2)
#兩個inner函數記憶體地址。
# #########################################
def func(arg):
    def inner():
        arg()
    return inner

def f1():
    print(123)

v1 = func(f1)
v1()
# ###########################################
def func(arg):
    def inner():
        arg()
    return inner

def f1():
    print(123)
    return 666

v1 = func(f1)
result = v1() # 執行inner函數 / f1含函數 -> 123 
print(result) # None
# ###########################################
def func(arg):
    def inner():
        return arg()
    return inner

def f1():
    print(123)
    return 666

v1 = func(f1)
result = v1() # 執行inner函數 / f1含函數 -> 123
print(result) # 666


def func():
    print(1)
    
v1 = func
func = 666

===========================裝飾器=========

def func(arg):
    def inner():
        print('before')
        v = arg()
        print('after')
        return v 
    return inner 

def index():
    print('123')
    return '666'


# 示例一
"""
v1 = index() # 執行index函數,列印123並返回666賦值給v1.
"""
# 示例二
"""
v2 = func(index) # v2是inner函數,arg=index函數
index = 666 
v3 = v2()
"""
# 示例三
"""
v4 = func(index)
index = v4  # index ==> inner 
index()
"""

# 示例四
index = func(index)
index()

def func(arg):
    def inner():
        v = arg()
        return v 
    return inner 

# 第一步:執行func函數並將下麵的函數參數傳遞,相當於:func(index)
# 第二步:將func的返回值重新賦值給下麵的函數名。 index = func(index)
@func 
def index():
    print(123)
    return 666

print(index)
index=func(index)
index()

裝飾器:在不改變原函數內部代碼的基礎上,在函數執行之前和之後自動執行某個功能。 (之前和之後增加某些功能-func)

應用:

# 計算函數執行時間
import time
def wrapper(func):
    def inner():
        start_time = time.time()
        v = func()
        end_time = time.time()
        print(end_time-start_time)
        return v
    return inner

@wrapper
def func1():
    time.sleep(2)
    print(123)
@wrapper
def func2():
    time.sleep(1)
    print(123)

def func3():
    time.sleep(1.5)
    print(123)

func1()
#裝飾器作用,在變動原函數(func)的基礎上,增加原函數的功能(在wrapper里增加)。
#在不改變原函數內部代碼的基礎上,在函數執行之前和之後自動執行某個功能。

總結

  • 目的:在不改變原函數的基礎上,再函數執行前後自定義功能。
  • 編寫裝飾器 和應用
    # 裝飾器的編寫
    def x(func):
    def y():
    # 前
    ret = func()
    # 後
    return ret
    return y

    # 裝飾器的應用
    @x
    def index():
        return 10
    
    @x
    def manage():
        pass
    
    # 執行函數,自動觸發裝飾器了
    v = index()
    print(v)
  • 應用場景:想要為函數擴展功能時,可以選擇用裝飾器。
  • 記住:
    • 裝飾器編寫格式
      def 外層函數(參數): #參數是函數名
      def 內層函數(*args,**kwargs):
      return 參數(*args,**kwargs)
      return 內層函數
    • 裝飾器應用格式
      @外層函數
      def index():
      pass

      index()
    • 問題:為什麼要加 *args, **kwargs

3.推導式

  • 列表推導式
    • 基本格式
      """
      目的:方便的生成一個列表。
      格式:
      v1 = [i for i in 可迭代對象 ]
      v2 = [i for i in 可迭代對象 if 條件 ] # 條件為true才進行append
      """
      v1 = [ i for i in 'alex' ]
      v2 = [i+100 for i in range(10)]
      v3 = [99 if i>5 else 66 for i in range(10)]

      def func():
          return 100
      v4 = [func for i in range(10)]
      
      v5 = [lambda : 100 for i in range(10)]
      result = v5[9]()
      
      def func():
          return i
      v6 = [func for i in range(10)]
      result = v6[5]()
      
      v7 = [lambda :i for i in range(10)]
      result = v7[5]()
      
      
      v8 = [lambda x:x*i for i in range(10)] # 新浪微博面試題
      # 1.請問 v8 是什麼?
      # 2.請問 v8[0](2) 的結果是什麼?
      
      # 面試題
      def num():
          return [lambda x:i*x for i in range(4)]
      # num() -> [函數,函數,函數,函數]
      print([ m(2) for m in num() ]) # [6,6,6,6]
      
      # ##################### 篩選 #########################
      v9 = [i for i in range(10) if i > 5]
  • 集合推導式
    v1 = { i for i in 'alex' }
  • 字典的推導式
    v1 = { 'k'+str(i):i for i in range(10) }

今日總結

  • 裝飾器 (6**)
    • 編寫格式:雙層嵌套函數
    • 應用格式:@外層函數
    • 理解:
      • 變數賦值
        def func():
        print(1)

        v1 = func
        func = 666
      • 看看到底return的是什麼?
      • 自己 > 上級作用域
    • 背會:
      @xx # index = xx(index)
      def index():
      pass
      index()
  • 推導式(3*)
  • 模塊
    import time

    v = time.time() # 獲取當前時間
    time.sleep(2) # 睡2秒

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 掛載全局方法 使用jsencrypt進行rsa加密 原文鏈接:Js參數RSA加密傳輸,jsencrypt.js的使用 CSDN博客 https://blog.csdn.net/p312011150/article/details/80264144 (原文處有一個地方不對,不需要轉換+,rsa已經做過 ...
  • ``` 你把函數定義在 Vue 的原型鏈上,只能在 Vue 的實例里才能取到這個方法。 vue組件 是一個Vue 的實例,所以你當然能在這裡調用到 ajax 方法。 而,vuex 只是一個 vue插件,在 vuex 里的 this 不是指向 vue實例的,所以肯定是取不到 ajax 方法的。 建議:... ...
  • vue cli3 一直運行 /sockjs node/info?t= 解決方案 首先 sockjs node 是一個JavaScript庫,提供跨瀏覽器JavaScript的API,創建了一個低延遲、全雙工的瀏覽器和web伺服器之間通信通道。 服務端:sockjs node(https://gith ...
  • 當需要從vuex中獲取的變數特別多是,可以使用mapState代替 當一個組件需要獲取多個狀態時候,將這些狀態都聲明為計算屬性會有些重覆和冗餘。為瞭解決這個問題,我們可以使用 mapState 輔助函數幫助我們生成計算屬性,讓你少按幾次鍵: // 在單獨構建的版本中輔助函數為 Vuex.mapSta ...
  • axios 基於http客戶端的promise,面向瀏覽器和nodejs 特色 瀏覽器端發起XMLHttpRequests請求 node端發起http請求 支持Promise API 監聽請求和返回 轉化請求和返回 取消請求 自動轉化json數據 客戶端支持抵禦 安裝 使用npm: npm inst ...
  • |這個作業屬於哪個課程|軟體工程| | | | |這個作業要求在哪裡|第一次個人編程作業| |這個作業的目標|完成漢字編程| |作業正文|見下文 | |其他參考文獻|無,但是感謝洪成龍與陳徳渠的解答 | 編程信息 時間:2020.02.06|2020.02.07 代碼行數:86行|338行 需求分析 ...
  • 前言:之前打 CTF 的時候都是零零碎碎的學習Python,沒有成體系,學得不精。趁著過年的這段時間好好地系統學習一下,加強自己的python技能。同時也做一個記錄,用來總結和反思,如果能給後學者一點幫助,那就再好不過了。 [TOC] 一、Python的下載 1. 到Python的 "官網" 上看適 ...
  • 1.CS和BS CS:Client/Server 客戶端和伺服器,這種軟體往往需要安裝。比如QQ、迅雷、播放器。 優點 : 可以減輕伺服器端壓力,將部分代碼寫到客戶端,並且界面很美觀。 缺點 : 一旦伺服器更新了,客戶端也需要更新,分散式開發比較弱。 BS:Browser/Server 瀏覽器和服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...