Day 10 函数形参: 万能参数:参数顺序:仅限关键字参数:名称空间:加载取值顺序:函数嵌套

1 今日内容大纲

  • 学习方法:
    • 安装环境
    • 项目需求提问
    • 自学能力,独立解决问题
  • 形参角度:
    • 万能参数
    • *的魔性用法
    • 仅限关键字参数(了解为主)
    • 形参的最终顺序
  • 名称空间
    • 全局名称空间,局部.....
    • 加载顺序,取值顺序.
    • 作用域
  • 函数的嵌套(高阶函数)
  • 内置函数:globals locals
  • 关键字:nonlocal,global

2 昨日内容回顾作业讲解

  1. 函数以功能为导向,减少重复代码,提高代码的可读性

    def func():
    	函数体
    
    • 函数的调用

      func()
      func()
      func()	
      
      
    • 函数返回值:

      • return
        • 终止函数
        • return单个值 ----- 单个值
        • return多个值 ------ 元组
    • 函数的参数:

      • 实参角度:位置参数,关键字参数,混合参数
      • 形参角度:位置参数,默认参数

3 今日内容

  1. 如何在工作中不让别人看出你是培训出来的?

    1. 第一天安装环境等,小白各种问
    2. 项目需求不清晰,也不敢问
    3. 六个月内学会自主学习,自己解决问题
  2. 形参角度:

    • 万能参数

    • *的魔性用法

      # 形参角度
      # 万能参数
      def eat(a,b,c,d):
          print('我请你吃:%s,%s,%s,%s'%(a,b,c,d))
      
      eat('蒸羊羔','蒸熊掌','烧花鸭','烧子鹅')
      
      def eat(a,b,c,d,e,f):     #写死了
          print('我请你吃:%s,%s,%s,%s,%s,%s'%(a,b,c,d,e,f))
      
      eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
      
      
      # 急需要一种形参,可以接受所有的实参
      # 万能参数: *args,约定俗成
      # 函数定义时,*代表聚合.他将所有的位置参数,聚合成一个元组,赋值给args
      def eat(*args):
          print(args)#('蒸羊羔', '蒸熊掌', '蒸鹿邑', '烧花鸭', '烧雏鸡', '烧子鹅')
          print('我请你吃:%s,%s,%s,%s,%s,%s'% args)
      
      eat('蒸羊羔', '蒸熊掌', '蒸鹿邑','烧花鸭','烧雏鸡','烧子鹅')
      
      
      # 写一个函数:计算你传入函数的所有的数字的和
      def func(*args):
          s = 0
          for i in args:
              s += i
          return s
      
      print(func(1,2,3,4,5))
      
      # **kwargs
      # 函数的定义时: **将 所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs!!!!!!!!!!!
      def func(**kwargs):
          print(kwargs)
      
      func(name='alex',age='29',sex='boy')#{'name': 'alex', 'age': '29', 'sex': 'boy'}
      
      # 万能参数:*args,**kwargs,
      def func(*args,**kwargs):
          print(args)#()
          print(kwargs)#{}
      
      func()
      
      # 在函数的调用时,*代表打散
      def func(*args,**kwargs):
          print(args) #(1, 2, 3, 11, 22, 33, 44)
          print(kwargs) #{}
      # func(*[1,2,3],*[11,22,33,44])
      # func(*'laskfjka',*'lklkla') #('l', 'a', 's', 'k', 'f', 'j', 'k', 'a', 'l', 'k', 'l', 'k', 'l', 'a') 相当于输入单个元素
      func(**{'name':'alex'},**{'age':'29'})  #{'name': 'alex', 'age': '29'} 相当于输入键值对
      
    • 形参的最终顺序(了解仅限关键字参数):

      # 形参角度的参数顺序:
      # *args 的位置?
      def func(*args,a,b,sex = '男'):
          print(a,b)
      func(1,2,3,4)   #func() missing 2 required keyword-only arguments: 'a' and 'b' ###报错!!1
      
      # args得到实参的前提,sex必须被覆盖
      def func(a,b,sex = '男',*args):
          print(a,b)  #1 2
          print(sex)  #3
          print(args) #(4, 5, 6, 7, 8, 9)
      func(1,2,3,4,5,6,7,8,9)
      
      def func(a,b,*args,sex = '男'):
          print(a,b)  #1 2
          print(args) #(3, 4, 5, 6, 7, 8, 9)
          print(sex)  #女
      func(1,2,3,4,5,6,7,8,9,sex='女')
      
      # **kwargs 的位置?
      def func(a,b,*args,sex ='男',**kwargs):
          print(a,b)  # 1 2
          print(args) # (3, 4, 5, 6, 7, 8)
          print(sex)  # 女
          print(kwargs)   # {'name': 'alex', 'age': '29', 'edu': '小学'}
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='29',edu= '小学')
      
      #形参角度的第四个参数:仅限关键字参数(了解)
      def func(a,b,*args,sex = '男',c,**kwargs):
          print(a, b) #1 2
          print(args) #(3, 4, 5, 6, 7, 8)
          print(sex)  #女
          print(c)    #6666666666    #仅限关键字参数!!!!
          print(kwargs)   #{'name': 'alex', 'age': '19', 'edu': '小学'}
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',edu='小学',c='6666666666')
      func(1,2,3,4,5,6,7,8,sex='女',name='alex',age='19',c='6666666666',edu='小学')#结果一致
      
      #形参角度的最终顺序: 位置参数 ,  *args  ,  默认参数  ,  仅限关键字参数  ,  **kwargs
      
  3. 名称空间(示意图见Day 10.pdf)

    1. 全局名称空间
    2. 局部名称空间
    3. 内置名称空间
    # 名称空间:命名空间
    
    a = 1
    b = 2
    def func():
        f = 5
        print(f)
    c = 3
    func()    # 5
    
    #内置名称空间:python源码给你提供了一些内置的函数:print,input
    # print(666)
    # python分为三个空间:
        #内置名称空间(builtins.py)
        #全局名称空间(当前py文件)
        #局部名称空间(函数,函数执行时才开辟,函数结束运行,空间消失)
    
    # 加载顺序:
    # 内置名称空间---->全局名称空间------->局部名称空间(函数执行时)
    def func():
        pass
    func()
    a = 5
    print(666)
    
    # 取值顺序(就近原则)并且单项不可逆
    # LEGB 原则
    input = '太白金星'
    def func():
        input = 'alex'
        print(input)
    func()  #alex
    #(从局部找时)局部名称空间 ----> 全局名称空间 ----> 内置名称空间
    #(从全局找时)全局名称空间 ----> 内置名称空间
    
  4. 作用域

    # 作用域:
    #   两个作用域:
    #       1.全局作用域:内置名称空间 + 全局名称空间
    #       2.局部作用域:局部名称空间
    
    # # 局部作用域 可以引用 全局作用域的变量
    data = '周五'
    def func():
        a = 666
        print(data)
    # print(a)
    func()
    # print(a)
    
    # 局部变量不能改变全局变量.
    count = 1
    def func():
        count += 2
        print(count)
    func()              #UnboundLocalError: local variable 'count' referenced before assignment
    # 局部作用域不能改变全局作用域的变量.  因为  当python解释器读取到局部作用域时,发现了你对一个变量进行修改的操作,
    # 解释器会认为你在局部已经定义过这个局部变量了,他就会从局部找这和变量,就会报错
    
    # 使用可以,带不能改变
    def func():
        count = 1
        def inner():
            print(count)
        inner()
    func()
    
    def func():
        count = 1
        def inner():
            count += 1
            print(count)    #报错
        inner()
    func()
    
  5. 函数的嵌套(高阶函数)(图解见pdf):

    # 例1
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        print(4)
    
    func1()
    print(1)
    func2()
    print(2)
    # in func1,3,1,in func2,4,2
    
    
    # 例2:
    def func1():
        print('in func1')
        print(3)
    
    def func2():
        print('in func2')
        func1()
        print(4)
    
    print(1)
    func2()
    print(2)
    # 1,in func2,in func1,3,4,2
    
    # 例3:
    def fun2():
        print(2)
    
        def fun3():
            print(6)
    
        print(4)
        fun3()
        print(8)
    
    print(3)
    fun2()
    print(5)
    # 3,2,4,6,8,5
    
  6. 内置函数 globals locals

    '''
    本文件:研究内置函数:globals locals
    '''
    a = 1
    b = 2
    def func():
        name = 'alex'
        age = 73
        sex = 'boy'
        print(globals()) # 返回的是字典:字典里面的键值对:全局作用域的所有内容。
        print(locals())# 返回的是字典:字典里面的键值对:当前作用域的所有的内容。
    func()
    print(globals()) # 返回的是字典:字典里面的键值对:全局作用域的所有内容。
    print(locals())# 返回的是字典:字典里面的键值对:当前作用域的所有的内容。
    
    
  7. 关键字nonlocal global.

4 今日总结

  1. 参数:
    1. 形参角度:
      • 万能参数
      • 仅限关键字参数(了解)
      • 参数的顺序
      • *的魔性用法:聚合,打散
  2. 名称空间,作用域,取值顺序,加载顺序
  3. globals(),locals()
  4. 高阶函数执行顺序

5 下周预习内容

  1. 函数名的运用,迭代器
  2. 生成器
原文地址:https://www.cnblogs.com/Redbean1231/p/13289606.html