Python之第十天的努力--万能参数,名称空间,作用域与高阶函数与glbals(),locals()

01 内容回顾

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

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

  • 函数的返回值return

    • 终止函数

      def func():
          count = 1
          while 1:
              count += 1
              print(count)
              return
      func()    # 2
      
    • return 单个值

    • return 多个值:(1,2,3,'hhh')

  • 函数的参数:

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

02 练习

# 3.写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
# def func(x):
#     return True if x > 5 else False

# def func(x):
#     return len(x) > 5
# print(func('154544'))


# 7.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
# dic = {"k1": "v1v1", "k2": [11,22,33,44]}
# PS:字典中的value只能是字符串或列表
# def func(dic):
#     new_dic = {}
#     for key,value in dic.items():
#         new_dic[key] = value[:2]
#     return new_dic
# print(func(dic))

03 函数的参数2

  1. 万能参数

    • *args:

      # 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
      # * 函数定义时,*代表:聚合  将所有的位置参数聚合成一个元组,赋值给args
      # def eat(*args):
      #     print('我请你吃:%s,%s,%s,%s,%s,%s'% args)
      #
      # eat('蒸羊羔','蒸熊掌','烧花鸭','烧子鹅','腊肉','酱鸡')
      
      # 写一个函数:计算你传入函数的所有的数字的和。
      # def func(*args):
      #     # print(args)
      #     count = 0
      #     for i in args:
      #         count += i
      #     return count
      #
      # print(func(1,2,3,4,5,6,7,8,9))
      
    • **kwargs:

      # **kwargs
      # 函数定义时: ** 将所有的关键字参数聚合到一个字典中,将这个字典赋值给kwargs
      # def func(**kwargs):
      #     print(kwargs)
      # func(name='zs',age='18',sex='男')
      
    • # 万能参数:*args   **kwargs
      # def func(*args,**kwargs):
      #     print(args)
      #     print(kwargs)
      # func()
      
      # * ** 在函数调用时,* 代表打散
      # def func(*args,**kwargs):
      #     print(args)
      #     print(kwargs)
      # func([1,2,3],[11,22])              # ([1, 2, 3], [11, 22])
      # func(*[1,2,3],*[11,22])            # (1, 2, 3, 11, 22)
      # func({'name':'zs'},{'age':18})     # ({'name': 'zs'}, {'age': 18})
      # func(**{'name':'zs'},**{'age':18}) # ()   {'name': 'zs', 'age': 18}
      
  2. 形参角度参数的顺序:

    # 形参角度的参数顺序
    # def func(a,b,*args,name='hhh',**kwargs):
    #     print(a,b)
    #     print(name)
    #     print(args)
    #     print(kwargs)
    # func(1,2,3,4,5,name='kkk',sex='男',age='18')
    # 形参角度第四个参数:仅限关键字参数
    
    
    # 形参角度的最终顺序:位置参数,*args,默认参数,仅限关键字参数,**kwargs
    

03 名称空间

  1. 全局名称空间

    image-20200610194648763

  2. 局部名称空间(临时名称空间):

    image-20200610195320504

  3. 内置名称空间:

    # 内置名称空间:Python源码给你提供的一些内置的函数,print  input
    
  4. # Python分为三个空间:
        # 内置名称空间  (builtins.py)
        # 全局名称空间  (当前py文件)
        # 局部名称空间  (函数,函数内部执行时才开辟)
    
    # 加载顺序:
    # 内置名称空间   全局名称空间    局部名称空间(函数执行时)
    
    # 取值顺序(就近原则)  单向不可逆
    # name = 'zs'
    # def func():
    #     name = 'kk'
    #     print(name)
    # func()          # kk
    # print(name)     # zs
    

05 作用域与高阶函数与glbals(),locals()

  1. 作用域

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

    image-20200610202918750

    # 高阶函数
    def func():
        count = 1
        def inner():
            # count += 1    # 报错
            print(count)
        inner()
    func()
    
    1. 三个例题
      # 例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 func2():
          print(2)
      
          def func3():
              print(6)
      
          print(4)
          func3()
          print(8)
      
      print(3)
      func2()
      print(5)
      # 3
      # 2
      # 4
      # 6
      # 8
      # 5
      
  3. glbals(),locals()

    a = 1
    b = 2
    def func():
        name = 'hhh'
        age = 18
    print(globals())   # 返回字典:字典里的键值对:全局作用域的所有内容。
    print(locals())    # 返回字典:字典里的键值对:当前作用域的所有内容。
    
posted @ 2020-06-10 20:52  ET-珩  阅读(97)  评论(0)    收藏  举报