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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...