• 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. 生成器
  • 相关阅读:
    执行脚本,且以脚本名保存log
    循环读取寄存器(QSFP-DD)并且分别保存log
    shell脚本添加脚本执行时间和当前运行次数current running time
    软件后门种植
    IPC$管道的利用与远程控制
    古典密码-维吉尼亚密码实验
    古典密码之乘法密码
    古典密码之凯撒密码
    密码破解工具Brutus
    ASPack壳脱壳实验
  • 原文地址:https://www.cnblogs.com/Redbean1231/p/13289606.html
Copyright © 2020-2023  润新知