python_0基礎開始_day13

来源:https://www.cnblogs.com/linglichong/archive/2019/08/20/11385712.html
-Advertisement-
Play Games

第十三節 一,匿名函數 匿名函數 == 一行函數 lambda == def == 關鍵字 函數體中存放的是代碼 生成器體中存放的也是代碼 就是yield導致函數和生成器的結果不統一 函數體中存放的是代碼 生成器體中存放的也是代碼 就是yield導致函數和生成器的結果不統一 二,內置函數Ⅱ sep ...


第十三節

一,匿名函數

  1. 匿名函數 == 一行函數

    lambda == def == 關鍵字

    • 函數體中存放的是代碼

    • 生成器體中存放的也是代碼

    • 就是yield導致函數和生成器的結果不統一

    lambda x:x
    # x,可以不寫是普通函數的形參,可以不接受參數
    # :後邊是返回值,x必須寫 是普通函數的函數值 (lambda只能返回一個數據類型)
    print(lambda x:x)
    print((lambda x:x+6)(5))

    f = lambda x:x+6(5)
    print(f.__name__)# 查看函數名字   lambda

    f1 = lambda x,y,z,:(x,y,z) # :返回值必須是一個數據類型
    print(f(1,2,3))# 輸出一個元組(1,2,3)

    print([lambda :5][0]())
    print((lambda :5)())
    a = lambda :5
    a()
    # 返回 5 5  

    lst = [lambda :i for i in range(5)]
    print(lst[1]) # 返回的是索引1的函數記憶體地址
    print(lst[0]()) # 調用函數,返回值,返回的是i最後一次迴圈所賦值
    lst = [] # [lambda x:x+1,lambda x:x+1]
    for i in range(2):
       lst.append(lambda x:x+1)
    print(lst[-1](5)) # 輸出6, lambda 5:5+1

    lst = [lambda x:x+1 for i in range(5)] # 同上一個
    print(lst[0](5))# 輸出6, lambda 5:5+1

    tu = (lambda :i for i in range(3)) # 生成器
    print(next(tu)) # 沒調用,就是返回函數地址
    print(next(tu)()) # 記錄上一次查看的位置,輸出 1
    # 面試題拆解:
    lst = [] 
    for i in range(5):
       def func():
           return i
       lst.append(func) # lst 裡面放了5個func函數的地址
    print(lst[1]) # 輸出的是函數地址
    print(lst[1]()) # 調用函數,返回的是i最後一次迴圈
    def func():
       for i in range(3):  # i = 0 1 2
           def foo():      # foo1 foo2 foo3
               return i
           yield foo       # foo1 foo2 foo3
    g = func()
    print(next(g)())  # foo1 返回的是值
    print(next(g)())  # foo2
    print(next(g))  # foo3 返回的是地址,沒有調用
    ------------------------------------------------------
    lst = [lambda :i for i in range(3)] # lst中有三個lambda : i
    print(lst[0]()) # 取的是最後一次i迴圈的值
    -----------------------------------------------------
    tu = (lambda : i for i in range(3)) # 生成器是把迴圈的每次值 都存放在一個地址中
    print(next(tu)())
    print(next(tu)())  # 每次都是yield 逐個提取
    print(next(tu)())
    lst = [lambda x:x+5 for i in range(2)]
    # lst = [lambda x:x+5,lambda x:x+5]
    print([i(2) for i in lst]) # x = 2,
    # 返回結果 [7,7]
    # 以下為分解式子
    lst = [] # [lambda x:x+5,lambda x:x+5]
    for i in range(2):
       lst.append(lambda x:x+5)
    new_lst = []
    for i in lst:
       new_lst.append(i(2))
    print(new_lst)
    ---------------------------------------------------
    lst = (lambda x:x+5 for i in range(2))
    print(i(2) for i in lst) # 是一個記憶體地址
    print([i(2) for i in lst]) # 是列表的兩個值,[7,7]
    # 以下是分解
    def func():
       for i in range(2):
           f = lambda x: x + 5
           yield f
    g = func()
    lst = []
    for i in g:
       lst.append(i(2))
    print(lst)
    lst = [lambda x:x*i for i in range(2)]
    print([i(2) for i in lst])  #[2,2]
    # 以下為分解式
    lst = [] # [lambda x:x*i,lambda x:x*i]
    for i in range(2):
       lst.append(lambda x:x*i)
    # print(i)
    new_lst = []
    for em in lst:
       new_lst.append(em(2))
    print(new_lst)
    lst = (lambda x:x*i for i in range(2))# 這是一個生成器
    print([i(2) for i in lst])  #[0,2] # i為0的時候存儲一次,i為1的時候存儲一次
    # 分解
    def func():
       for i in range(2):
           f = lambda x:x*i
           yield f
    g = func()
    lst = []
    for i in g:
       lst.append(i(2))
    print(lst)
    func = lambda x:[i for i in x]
    print(func('afafasd'))
    # 將字元串轉換列表['a', 'f', 'a', 'f', 'a', 's', 'd']
    print(list('afafasd'))

二,內置函數Ⅱ

    • sep :每一個元素之間分割的方法 預設 " "

      print(1,2,3,sep="|")# 1|2|3
    • end : print執行完後的結束語句,預設\n

      print(1,2,3,end="")
      print(4,5,6,end="") # 1 2 34 5 6
    • file : 文件句柄,預設顯示到屏幕

      print(1,2,3,4,file=open("test","w",encoding="utf-8"))
    • flush 刷新

    • sum : 求和,可迭代對象容器,容器的元素必須是數字

      print(sum([1,2,2,1]))
      print(sum([10,20,30,40],100))# 設置初始值
    • abs : 絕對值

      print(abs(-9))
    • dir : 查看當前對象的所有方法

      print(dir(str))
    • zip : 拉鏈,當長度不一致時選擇最短的進行合併

      lst1 = [1,2,3,5]
      lst2=["alex","wusir","元"]
      print(list(zip(lst1,lst2))) # 拉鏈
      # 面試題:
      print(dict(zip(lst1,lst2)))
      # {1: 'alex', 2: 'wusir', 3: '寶元'}
    • format : 格式轉換

      print(format("alex",">20"))  # 右對齊
      print(format("alex","<20"))  # 左對齊
      print(format("alex","^20"))  # 居中
      # 進位轉換:
      # 將十進位轉換成二進位 bin
      print(format(12,"b"))
      print(format(12,"08b"))

      # 將十進位轉換成八進位   oct
      print(format(12,"o"))
      print(format(12,"08o"))

      # 將二進位轉換成十進位   digit
      print(format(0b11001,"d"))

      # 將十進位轉換成十六進位   hex
      print(format(17,"x"))
      print(format(17,"08x"))
    • reversed : 反轉

      print(list(reversed("alex")))
      # ['x', 'e', 'l', 'a']
      print(list(reversed([1,2,3,4,5])))
      # [5, 4, 3, 2, 1]
    • filter : 過濾,1,指定過濾規則(函數名[函數的記憶體地址]) 2,要過濾的數據

      lst = [1,2,3,4,5,6]
      print(list(filter(lambda x:x>1,lst)))
      # 分解
      def func(a):
         return a>1
      print(list(filter(func,lst)))
      -------------------------------------------------
      # 底層代碼
      lst = [1,2,3,4,5,6]
      def f(func,args):
         new_lst = []
         for i in args:
             if func(i):
                 new_lst.append(i)
         return new_lst
      def func(a):
         return a>1
      print(f(func,lst)) # [2,3,4,5,6]
      # fiter寫法
      print(list(filter(lambda x:x>2,[1,2,3,4,5])))
      lst = [{'id':1,'name':'alex','age':18},
            {'id':1,'name':'wusir','age':17},
            {'id':1,'name':'taibai','age':16},]
      # 篩選年齡大於16歲的
      print(list(filter(lambda x:x['age']>16,lst)))
      --------------------------------------------------
      def func(a):
         return a>1
      print(list(filter(func,[1,2,3,4,5])))
      print(list(filter(lambda a:a>1,[1,2,3,4,5])))
    • map : 映射函數(將每個元素都執行了執行的方法)

      print([i*8 for i in [1,2,3,4]])
      #[8, 16, 24, 32]
      -----------------------------------------------------------
      lst = []
      for i in [1,-22,3,4,5,6]:
         lst.append(abs(i))
      lst.sort()
      print(lst)# [1, 3, 4, 5, 6, 22]
      ------------------------------------------------------------
      def map(argv,args):
         lst = []
         num = len(args) if len(args) < len(argv) else len(argv)
         for i in range(num):
             lst.append(argv[i] + args[i])
         return lst
      print(map([1,2,3,4],[3,4,5,6,7,8,9,0]))
      print(list(map(lambda x,y:x+y,[1,2,3,4,5],[33,22,44,55])))
      # [4, 6, 8, 10]
    • sorted : 排序

      print(sorted([1,2,3,4,5,6],reverse=True))
      print(sorted([1,2,3,4,5,-6],reverse=True,key=abs))
      lst = ["三國演義","紅樓夢","鐵道游擊隊","西游記","水滸傳","活著"]
      print(sorted(lst,key=len))
      # [6, 5, 4, 3, 2, 1]
      # [-6, 5, 4, 3, 2, 1]
      # ['活著', '紅樓夢', '西游記', '水滸傳', '三國演義', '鐵道游擊隊']
      -----------------------------------------------------------------
      print(sorted([1,-22,3,4,5,6],key=abs))  # key指定排序規則
      #[1, 3, 4, 5, 6, -22]
      ------------------------------------------------------------------
      lst = [{"age":19},{"age1":20},{"age2":80},{"age3":10}]
      print(sorted(lst,key=lambda x:list(x.values()))) # 值排序
      print(sorted(lst,key=lambda x:list(x.keys()),reverse=True)) # 鍵排序
    • max : 最大值

    • min : 最小值

      print(max(10,12,13,15,16))
      print(max([10,12,13,15,-16],key=abs))
      # 16   -16
    • reduce : 累計算

      from functools import reduce

      # 從 functools工具箱中拿來了reduce工具
      from functools import reduce
      def func(x,y):
         return x+y
      print(reduce(func,[1,2,3,4,5]))
      print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
      # 15 15  

三,閉包

  1. 什麼是閉包?

    在嵌套函數內,使用非本層變數和非全局變數就是閉包

  2. 閉包的作用:

    1,保護數據的安全性。2,裝飾器

  3. __colsure__查看是是否為閉包

  4. 函數執行完後,函數體內文件自動銷毀

    例一:
    def wrapper():
       a = 1
       def inner():
           print(a)
       return inner
    ret = wrapper() # 閉包
    例二:
    a = 2
    def wrapper():
       def inner():
           print(a)
       return inner
    ret = wrapper() # 不是
    例三:
    def wrapper(a,b):
       def inner():
           print(a)
           print(b)
       inner()
    a = 1
    b = 2
    wrapper(a,b)
  5.  


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

-Advertisement-
Play Games
更多相關文章
  • 有時候手工執行Python腳本跑的好好的,但是部署到Linux的crontab中後,就會遇到一些問題,最近終於有空整理一下這方面的內容,其實也是自己也踩了一些別人踩過的坑!這裡僅僅列舉個人遇到的一些小問題,經驗和精力問題,不能面面俱到,僅總結一下自己遇到的這些問題。 環境變數問題 cron中的環境變... ...
  • 4.1.如何讀寫csv數據 爬取豆瓣top250書籍 結果 把評分為9.0的書籍保存到book_out.csv文件中 4.2.如何讀寫excel 安裝兩個庫 讀取excel 求分數的總和 結果 ...
  • 前言: 使用python在讀取配置文件時,由於配置文件中存在特殊字元,讀取時出現了以下錯誤: 錯誤代碼: 解決方案: 使用 RawConfigParser()方法進行讀取即可,代碼如下: ...
  • Java的 If 條件語句 條件判斷 示例 1 : if if(表達式1){ 表達式2; } 如果表達式1的值是true, 就執行表達式2 public class HelloWorld { public static void main(String[] args) { boolean b = t ...
  • 11.5 jQuery 引入方式: 文檔就緒事件: DOM文檔載入的步驟 基本篩選器: 表單常用篩選: 表單對象狀態屬性篩選: 註意:$(":checked")選擇時連select中的帶有selected屬性的option標簽也會選上,所以要用$("input:checked") <head> <s ...
  • 如果你有女朋友的話,那麼今天這個對你們來說真的是太棒了!如果沒有女朋友的話,同樣也可以用在心儀的人身上,每天不重覆的甜言蜜語,然後慢慢慢慢慢慢慢就有了 Github作為全球最大的同性交友網站,小伙伴們不僅可以在上面交流編程技巧,還能學到如何開發一個自動哄女友神器。 先附上Github地址: http ...
  • 引言: 在閱讀高手寫的代碼時,有很多簡寫的形式,如果沒有見過還真的看不太懂是什麼意思,其中一個比較常用的就是getattr()用來調用一個類中的變數或者方法,相關聯的hasattr()、getattr()、setattr()函數的使用也一併學習了一下; 正文: 1. hasattr(object, ...
  • 1.安裝GoAccess 工具可以直接使用 2.使用goaccess命令將日誌生成html文件 --real-time-html 表示實時的顯示日誌內容 --time-format 時間格式 --date-format 日期格式 --log-format 用於指定日誌字元串格式 命令執行完後開啟一個 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...