Day10 函數(shù)

函數(shù)

  1. 什么是匿名函數(shù)

    匿名函數(shù)還是函數(shù),只是聲明的格式和普通函數(shù)都不一樣,只適用于函數(shù)功能比較簡單的函數(shù)

  2. 匿名函數(shù)的聲明

    • 語法
      變量名 = lambda 形參列表:返回值
    • 說明
      變量名 - 相當(dāng)于函數(shù)名
      lambda - 聲明匿名函數(shù)的關(guān)鍵字
      形參列表 - 和普通函數(shù)的形參列表一樣
      :- 固定寫法
      返回值 - 相當(dāng)于普通函數(shù)中只有一條return語句的函數(shù)
  3. 匿名函數(shù)的調(diào)用和普通函數(shù)一樣

    # 1.匿名函數(shù)的參數(shù)也可以設(shè)置默認(rèn)值(不會有類型提示)
    # 2.匿名函數(shù)不能通過添加:類型名來說明參數(shù)類型
    
    func1 = lambda x, y = 0: 100
    func1(10,20)
    print(func1(10,20))
    # 匿名函數(shù)中可以設(shè)置不定長參數(shù)
    func2 = lambda  *nums: sum(nums)
    print(func2(1, 2, 3, 4))
    
    func3 = lambda x:print(x)
    print(func3(100))  # None
    

作用域

  1. 什么是變量的作用域
    就是變量能夠使用的范圍

  2. 全局變量和局部變量

    • 全局變量 - 沒有聲明在函數(shù)或者類中的變量都是全局變量
      全局變量的作用域是從聲明開始到整個文件結(jié)束,都可以用

    • 局部變量 - 聲明在函數(shù)或者類中變量就是局部變量

    • 總結(jié):當(dāng)我們調(diào)用函數(shù)的時候,系統(tǒng)會自動在棧區(qū)間,專門為函數(shù)開辟一塊獨(dú)立的內(nèi)存空間,
      ? 用來保存在函數(shù)中聲明的變量,(形參也是屬于聲明在函數(shù)中的變量)當(dāng)函數(shù)調(diào)用結(jié)束后,這個棧區(qū)間會自動銷毀
      ? -----(函數(shù)調(diào)用過程是一個壓棧的過程)

      # 1.全局變量1
      # 變量a是全局變量
      a = 100
      print(a)
      
      for x in range(5):
          print('循環(huán)里:', a)
      
      
      def func1():
          print('函數(shù)中:', a)
      
      
      func1()
      
      # 2.全局變量
      # 這兒的y也是全局變量
      for y in range(3):
          print(y)
      
      
      # 3.局部變量
      # a.函數(shù)的形參就相當(dāng)于聲明在函中的變量,所以就是局部變量
      
      def func3(num1):
          print(num1)
          for x in range(3):
              print(num1)
      
      
      func3(10)
      
      # 4.如果全局變量和局部變量同名,那么在局部變量作用域中使用的是局部變量,外部使用的是全局變量
      aa = 100
      
      
      def func5():
          aa = 200
          print('函數(shù)里', aa)
      
      
      print(func5())
      print(aa)
      
  3. global - 在函數(shù)中聲明一個全局變量(只能在函數(shù)中使用)
    在函數(shù)中:
    global 變量名
    變量名 = 值

    bb = 111
    
    
    def func6():
        global bb
        bb = 222
        print(bb)
    
    
    func6()
    print(bb)
    
  4. nonlocal - 想要在局部的局部去修改局部變量的值,就使用nonlocal對變量進(jìn)行說明

    nonlocal 局部變量
    局部變量 = 值

    def func11():
        abc = 123
    
        def func22():
            nonlocal abc
            abc = 333
            print('func22', abc)
    
        func22()
    
        print('func11', abc)
    
    
    func11()
    # func11 123
    
    
    list1 = []
    for i in range(5):
        list1.append(lambda x: x * i)
    
    """
    函數(shù)在調(diào)用的時候不會執(zhí)行
    list1 = []
    i = 0 list1[lambda x : x*i]
    i = 1 list1[lambda x : x*i, lambda x : x*i]
    i = 2 list1[lambda x : x*i, lambda x : x*i, lambda x : x*i]
    i = 3 list1[lambda x : x*i, lambda x : x*i, lambda x : x*i, lambda x : x*i]
    i = 4 list1[lambda x : x*i, lambda x : x*i, lambda x : x*i, lambda x : x*i, lambda x : x*i]
    """
    
    print(list1[0](3))
    print(list1[3](3))
    
    a = 10
    
    
    func8 = lambda x: x*a
    a = 20
    print(func8(2))
    

函數(shù)作為變量

python中聲明函數(shù),其實(shí)就是聲明一個類型是function的變量,函數(shù)名就是變量名

  1. 給別的變量賦值

    # 聲明了一個列表變量 list1
    list1 = [1, 2, 3]
    
    
    # 聲明一個函數(shù)變量func1
    def func1():
        print('我是一個函數(shù)')
        return 10
    
    
    # 列表變量給另外一個變量list2賦值
    list2 = list1
    # 賦值后就可以當(dāng)做列表來用
    print(list2[1])
    print(list2[::-1])
    
    # 使用函數(shù)變量給另外一個函數(shù)變量func2賦值
    func2 = func1
    # 賦值后func2就可以當(dāng)做函數(shù)來使用
    func2()
    print(func2())
    
  2. 變量作為容器類數(shù)據(jù)的元素

    a = 10
    nums = [a, 100, 100]
    print(nums)
    print(nums[0])
    
    
    def func3():
        print('abc')
        return 10
    
    
    list2 = [func3, func3(), 100]
    print(list2)
    print(list2[0])
    print(list2[0]())
    
  3. 變量作為函數(shù)的實(shí)參
    ? 函數(shù)作為函數(shù)的實(shí)參
    ? 函數(shù)1作為函數(shù)2的實(shí)參 -- 函數(shù)2是一個高階函數(shù)

    a = 10
    
    
    def func4(n: int):
        print(n + n - 1)
    
    
    func4(a)
    
    
    def func5(x):
        print(x)
        x(111)
    
    
    func5(func4)
    func5(lambda x: x*2)
    
  4. 函數(shù)作為參數(shù)的應(yīng)用:sort函數(shù)
    列表.sort(key=None, reverse=True)
    參數(shù)key - 要求是一個帶有一個參數(shù),并且返回值是bool的函數(shù)。這兒的參數(shù)指向的是列表中元素
    ? 確定按照元素的某一個值進(jìn)行排序

    list1 = [1, 2, 9, 8, 7, 5]
    list1.sort(reverse=True)
    print(list1)
    
    all_students = [
        {'name': '張三', 'age': 19, 'score': {'c': 78, 'm': 90, 'e': 40}},
        {'name': '李四', 'age': 24, 'score': {'c': 89, 'm': 60, 'e': 90}},
        {'name': '王五', 'age': 35, 'score': {'c': 78, 'm': 67, 'e': 86}},
        {'name': '趙六', 'age': 46, 'score': {'c': 34, 'm': 99, 'e': 50}}
    ]
    
    
    print(sum)
    # 這的item是需要排序的列表元素
    def func(item):
        return item['age']
    
    
    # all_students.sort(key=func)
    all_students.sort(key=lambda item: item['age'])
    # all_students.sort(key=lambda item: item['score'])
    all_students.sort(key=lambda item: (item['score']['c'] + item['score']['c'] + item['score']['c']))
    print(all_students)
    
  5. 變量作為函數(shù)的返回值
    函數(shù)1作為函數(shù)2的返回值 - 函數(shù)2是返回值高階函數(shù)

    def operation(char):
        if char == '+':
            def fun1(*nums):
                return sum(nums)
            return fun1
        elif char == '-':
            def fun2(*nums):
                if not nums:
                    return 0
                sum1 = nums[0]
                for index in range(1,len(nums)-1):
                    sum1 -= nums[index]
            return fun2
    
    
    print(operation('+')(1,2,3,4))
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容