Python旅途——函數的應用、lambda函數、內置函數、閉包

Python——函數的應用、lambda表達式、內置函數

今天主要分享函數的通常的應用場景,這裏給你們分爲初級一些的應用場景,以及高級的應用場景。還有一種特殊的函數形式——lambda表達式python

1.函數的初級應用場景

以前咱們學過了不少的數據類型,其中容器類型的有集合、字典、列表等,而函數也能夠做爲元素放進這些容器類型的數據類型面試

  1. 函數能夠放在集合裏,也能夠放在字典裏,在字典中的時候通常做爲字典的值閉包

    def func():
        print(123)
    def bar():
        print(666)
    info = {'k1': func, 'k2': bar}
    info['k1']()
    info['k2']()
  2. 函數名當變量來使用app

    def func():
        print(1,2,3)
    x = func()
    print(x)  
    lis = [func(),func(),func()]
    print(lis)
    def func():
        print(123)
    
    func_list = [func, func, func]
    # func_list[0]()
    # func_list[1]()
    # func_list[2]()
    for item in func_list:
        v = item()
        print(v)   # 123 None 123 None 123 None
    def func():
        print(123)
    
    def bar():
        print(666)
    
    info = {'k1': func, 'k2': bar}
    
    info['k1']()
    info['k2']()  #  123 666

    混淆:dom

    def func():
        return 123
    
    func_list1 = [func,func,func]
    func_list2 = [func(),func(),func()]
    
    print(func_list1)  # [<function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>]
    print(func_list2)  #[123, 123, 123]
  3. 函數能夠當參數進行傳遞函數

    def func(arg):
        v1 = arg()
        print(v1)
    
    def show():
        print(666)
    
    func(show)  #  666 None
    def func(arg):
        v1 = arg()
        print(v1)
    
    def show():
        print(666)
    
    result = func(show)
    print(result)   #666 None None

2.函數的lambda表達式

  • lambda表達式是用來表達簡單的函數,默認有返回值return編碼

    def func(a1,a2):
        return a1+a2
    func2 = lambda a1,a2:a1+a2
    v = func2(1,2)
    # 以上的兩種寫法是徹底等價的
  • 輸入兩個數,比較大小,返回大的那個rest

    func5 = lambda a,b:a if a>b else b  #輸入兩個數,返回其中大的數字
    v = func5(3,4)

3.內置函數

  1. 內置函數code

    • len:取長度
    • open:文件操做
    • range:範圍
    • id:判斷id
    • type:判斷類型
  2. 輸入輸出ip

    • input
    • print
  3. 強制轉換

    • dict():轉字典
    • list():轉列表
    • tuple():轉元組
    • str():轉字符串
    • int():轉數字
    • set():轉集合
    • bool():轉布爾
  4. 數字相關

    • abs() : 絕對值

      v = abs(-1)
      print(v)
    • float() :浮點型(小數)

      v = 55
      v1 = float(55)
      print(v1)
    • max() :最大值

      v = [1,2,311,21,3,]
      result = max(v)
      print(result)
    • min() :最小值

      v = [1,2,311,21,3,]
      result = min(v)
      print(result)
    • sum() :求和

      v = [1,2,311,21,3,]
      result = sum(v)
      print(result)
    • divmod() :兩數相除,得商和餘數

      a,b = divmod(1001,5)
      
      print(a,b)
    • 分頁功能

      # 練習題  請經過分頁對數據進行展現
      """
      要求:
          每頁顯示10條數據
          讓用戶輸入要查看的頁面:頁碼
      """
      lis = []
      for i in range(1,845):
          info = {'name':'大慄%s'%i,'age':'1%s'%i}
          lis.append(info)
      
      per_page= 10
      total_data = 845
      page,other = divmod(total_data,per_page)
      if other != 0:
          page += 1
      #  1    0-10
      #  2    10-20
      #  3    20-30
      while True:
          message = input('請輸入頁數:')
          message = int(message)
          if message>845 or message<1:
              print('錯誤')
          else :
              start_position = (message-1)*per_page
              end_position = message*per_page
              data = lis[start_position:end_position]
              print(data)
              for item in data:
                  print(item)
      LIS = []
      for i in range(1,934):
          info = {'name':'小豬%s'%i,'hobby':'睡覺%s'%i}
          LIS.append(info)
      how_many = 7
      hole_length = len(LIS)
      print(hole_length)
      hole_length,rest = divmod(hole_length,how_many)
      if rest != 0:
          hole_length += 1
          # 1    0,7
          #2     7,14
          #3     14,21
          #4     21,28
      
      while True:
          message = input("請輸入")
          message = int(message)
          if message>hole_length or message<1:
              print('輸入有誤,請在範圍內輸入;')
          else:
              start_location =(message-1)*how_many
              end_location = message*how_many
              total = LIS[start_location:end_location]
              for line in total:
                  print(line)
      """
  5. 編碼相關

    • chr :將十進制轉化爲Unicode編碼中對應的字符串

      v = chr(99)
      print(v)
    • ord :將Unicode編碼中對應的字符串找到並轉化爲其對應的十進制

      num = ord('中')
      # 應用
      # 隨機驗證碼
      import random  
      def get_random_code(length = 6):
          LIS = []
          for i in range(length):
              v = random.randint(65,90)
              LIS.append(chr(v))
              var = "".join(LIS)
          return var
      v1 = get_random_code(7)
      print(v1)
      import random # 導入一個模塊 
      
      v = random.randint(起始,終止) # 獲得一個隨機數
  6. 高級一點的內置函數

    • map:循環每一個元素(第二個參數),而後讓每一個元素執行函數(第一個參數),將每一個函數執行的結果保存到新的列表裏並返回。(有返回值)

      v1 = [11,22,33,44]
      result = map(lambda x:x+100,v1)
      print(list(result)) # 特殊
      #  每一個數乘以10
      v1 = [12,34,45,23]
      var = map(lambda x:x*10,v1)
      print(list(var))
    • filter

      v1 = [11,22,33,'asd',44,'xf']
      
      def func(x):
          if type(x) == int:
              return True
          return False
      result = filter(func,v1) # [11,]
      print(list(result))
      
      
      result = filter(lambda x: True if type(x) == int else False ,v1)
      print(list(result))
      
      result = filter(lambda x: type(x) == int ,v1)
      print(list(result))
    • reduce

      import functools
      v1 = ['wo','hao','e']
      
      def func(x,y):
          return x+y
      result = functools.reduce(func,v1)
      print(result)
      
      result = functools.reduce(lambda x,y:x+y,v1)
      print(result)
    • 面試題:

    • 經常使用的內置函數有哪些?

    • filter/map/reduce是什麼意思?

    • 什麼是匿名函數?

  7. 進制轉換相關

  • bin:將十進制轉換爲二進制

    num = 13
    v1 = bin(num)
    print(v1)
  • oct:將十進制轉換爲八進制

    num = 13
    v1 = oct(num)
    print(v1)
  • int:將十進制轉換爲十進制

    num = 13
    v1 = int(num)
    print(v1)
  • hex:將十進制轉換爲十六進制

    num = 13
    v1 = hex(num)
    print(v1)
  • 二進制轉換爲十進制

    v1 = "0b1101"
    result = int(v1,base = 2)
    print(result)
  • 二進制轉換爲八進制

    v1 = "0o1101"
    result = int(v1,base = 2)
    print(result)
  • 二進制轉換爲十六進制

    v1 = "0x1101"
    result = int(v1,base = 2)
    print(result)
  • ip地址轉換成二進制數(面試)

    # 1字節等於8位
    # IP: 192.168.12.79  ->  001010010 . 001010010 . 001010010 . 001010010
    
    # 1. 請將 ip = "192.168.12.79" 中的每一個十進制數轉換成二進制並經過,鏈接起來生成一個新的字符串。
    # 簡單版——假面試
    lis = []
    ip = "192.168.12.79"
    var = ip.split(".")
    for i in var:
        new_i = int(i)
        x = bin(new_i)
        lis.append(x)
        result = ",".join(lis)
    print(result)
    # 增強版——真面試
    lis = []
    ip = "192.168.12.79"
    a = ip.split(".")
    for i in a:
        new_i = int(i)
        var = bin(new_i)
        var = var[2:]
        if len(var) != 8:
            var = var.rjust(8,'0')
        lis.append(var)
        x = "".join(lis)
    print(int(x,base=2))

4.函數的高級應用場景

  • 函數內部執行相互之間不會混亂,執行完畢+內部元素不被其餘人使用

  • 函數能夠作返回值進行返回

    def func():
        print(123)
    
    def bar():
        return func
    # bar函數加括號執行通過return返回給v,此時v爲func函數,可是並無執行
    v = bar() 
    # v加括號,執行func函數
    v()
    def bar():
        def inner():
            print(123)
        return inner
    # bar函數加括號執行,將inner函數加載到內存,可是沒有執行,返回inner函數
    v = bar()
    # 此時的v爲inner函數,加括號執行
    v()
  • 函數的變量位置問題

    # 此時全局變量name爲大慄
    name = '大栗子'
    def bar():
        name = '小栗子'
        def inner():
            print(name)
        return inner
    # bar函數加括號執行時,將name=大栗子修改爲了name=小栗子,並保存到內存
    v = bar()
    # 此時v爲inner函數,執行打印name爲小栗子
    v()
    # 再來看一個
    name = '糖炒栗子'
    def bar(name):
        def inner():
            print(name)
        return inner
    v1 = bar('大慄') # { name=alex, inner }  # 閉包,爲函數建立一塊區域(內部變量供本身使用),爲他之後執行提供數據。
    v2 = bar('小慄') # { name=eric, inner }
    v1()
    v2()
    # 打印的name分別爲大慄、小慄
  • 帶閉包、傳參的面試題

    # 簡單版面試題
    info = []
    
    def func():
        print(item)
    # 此時的for循環已經結束,在內存地址中的item已經爲9
    for item in range(10):
        info.append(func)
    
    info[0]() # 9
    
    # 增強版
    info = []
    
    def func(i):
        def inner():
            print(i)
      return inner
    # 循環的時候,把每一個item封裝到了內存地址,爲後面的使用進行保留(閉包)
    for item in range(10):
        info.append(func(item))
    # 0 1 4
    info[0]()
    info[1]()
    info[4]()
  • 閉包:爲函數建立一塊區域(內部變量供本身使用),爲之後的執行提供數據

    def func(name):
        def inner():
            print(name)
      return inner 
    
    v1 = func('alex')
    v1()
    v2 = func('eric')
    v2()
  • 注:函數什麼時候被建立,進而判斷將變量保存到了內存地址

  • 高階函數:把函數當作參數傳遞、把函數當作返回值

  • 總結:函數執行的流程分析

    • 閉包的概念:爲函數建立一個區域併爲其維護本身的數據,之後執行時方便調用
    • 應用場景:裝飾器、SQLAlchemy源碼

今天主要分享了函數的一些簡單的應用、高級的應用、傳參、lambda函數的簡單使用,以及函數的相對高級的概念,什麼是閉包,這些都是咱們之後再敲代碼的時候須要緊緊掌握的。

相關文章
相關標籤/搜索