• 函数的总结


    1. 函数的定义

      • 函数: 函数是以功能为导向,一个函数封装一个功能
      • 函数减少代码的重复性,增强了代码的可读性
    2. 函数的结构

      def new_len(obj):  # new_len 函数名
          count = 1      # 函数体
          for i in obj:
              count += 1
          print(count)
      new_len('123456')
      '''
      def 关键字: 定义一个函数.紧跟一个空格 
      new_len 函数名: 与变量命名规范一至.一定要具有可描述性.
      (): 结构需要,传参用
      : :分隔符.
      tab键: 四个空格.缩进,函数体.
      '''
      
    3. 函数的调用

      使用函数名加小括号进行函数的调用

      写法:函数名() 这个时候函数的函数体会被执行

      def new_len(obj):
          count = 1
          for i in obj:
              count += 1
          print(count)
      new_len('sdadad')  # 函数名() 函数的执行者,调用者
      for el in range(3):
          new_len('sadadas')
      # 函数的调用写多少次,就执行多少次
      
    4. 函数的返回值

      • ruturn

        1. 结束函数,return下面的(函数内)的代码不会执行
        2. 给函数的调用者返回值
          1. 如果return后面什么都不写,或者函数中没有return,则返回的结果是None
          2. 如果return后面写了一个值,返回给调用者这个值
          3. 如果return后面写了多个结果,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量
        def new_len(obj):
            count = 1
            for i in obj:
                count += 1
            return count
        print(new_len('sdadad'))
        
    5. 函数的参数

      • 函数的实参传递给形参的过程叫做传参: 函数的拓展性

      • 实参角度 -- 函数的调用者

        1. 位置参数: 从左至右,按照顺序,一一对应.
        2. 关键字参数: 一一对应.
        3. 混合参数: 位置参数在关键字参数前面.
      • 形参角度:

        1. 位置参数: 与实参角度位置参数一样.

        2. 默认值参数: 一定在位置参数后面,不传参数即沿用默认的参数.

        3. 动态参数

          当给函数传入的参数数目不定时,之前的传参方式解决不了问题.

          def chi(*args):   # 定义一个函数的时候,* 将实参角度所有的位置参数聚合到一个元组中.
              print('我请你吃:', args)
          chi('蒸羊羔', '蒸熊掌', '蒸鹿尾')
          
          def func(**kwargs): # 函数定义时,**将实参的所有的关键字参数聚合成了一个字典给了kwagrs
              print(kwargs)
          func(name='小明', age='18', hobby='唱跳rap篮球')
          
          def func(*args, **kwargs): # 万能参数
              print(args, kwargs)
          
        4. 形参的顺序:

          • 位置参数 => *args => 默认值参数 => **kwargs

          • 仅限关键字参数:

            在 *args 和 **kwargs 中间

    6. *的魔法用法

      def func(*args, **kwargs):
          print(args)
          print(kwargs)
      l1 = [1, 2, 3]
      l2 = ['小明', '小红', '小丽']
      dic = {'k1': 'v1', 'k2': 'v2'}
      func(*l1, *l2)  # 函数的执行时: * 代表打散
      func(**dic)     # 函数的执行时: ** 代表打散 (key不能是int型)
      
      函数外:
      a, b, *c = [1, 2, 3, 4, 5, 6] # 处理剩余元素,得到列表形式
      print(a, b, c)
      
    7. 命名空间与作用域

      1. 命名空间:

        • 全局命名空间:我们直接在py文件中,函数外声明的变量
        • 内置命名空间:python最开始会开辟一个自己的命名空间 -- 内置命名空间
        • 局部命名空间:函数内部声明的变量
        • 加载顺序: 内置命名空间 => 全局命名空间 => 局部命名空间
        • 取值顺序: 局部命名空间 => 全局命名空间 => 内置命名空间
      2. 作用域:

        • 作用域: 变量或函数的声明周期

        • 全局作用域: 内置命名空间 全局命名空间

        • 局部作用域: 局部命名空间

          globals() # 查看全局作用域中的内容
          locals()  # 查看的是当前作用域中的内容
          
    8. 函数的嵌套

      # 函数可以互相嵌套:
      def outer():
          def inner():
              print('我是内部')
          print('我是外部')
          inner()
      outer()
      # 从上至下依次执行
      
    9. 拓展

      • global
        • 在局部作用域中可以更改全局作用域的变量(限于字符串,数字)
        • 利用global在局部作用域也可以声明一个全局变量(创建在全局)
      • nonlocal
        • 不能更改全局变量
        • 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且当前作用域也复制一份此变量
    10. 默认值参数的一个考点

      • 当你的默认值参数是可变的数据类型,那么你要当心了

        def func(a,lst=[]):  # 可变数据类型使用的是一个内存空间
            lst.append(a)
            return lst
        print(func(1))   #  [1]
        print(func(2))   #  [1,2]
        print(func(3, []))  # [3]
        
    11. 函数名的应用

      函数名是一个特殊的变量,它具有变量的特点

      • 函数名指向的是函数的内存地址,这个内存地址加上()就可以运行函数.

      • 函数名是一个变量,可以赋值运算

        def func():
            print(666)
        print(func)
        a = func
        a()   # 也可以运行函数func
        
      • 函数名可以作为容器类类型的元素

        def func():
            print(666)
        lst = [func,func,func,func]
        lst[1]()
        for el in lst:
            el()
        
      • 函数名可以作为函数的实参传进去

        def func1():
            print('in func1')
        def func2(argv)
            argv()
            print('in func2')
        func2(func1)
        
      • 函数名可以作为函数的返回值

        def func1():
            print('in func1')
        def func2(argv):
            print('in func2')
            return argv
        ret = func2(func1)
        ret()
        
  • 相关阅读:
    C#仿制QQ弹出消息框
    Winform下载文件
    asp.net文件下载
    C#FileStream复制大文件【转自www.bitsCN.com】
    C#解压或压缩文件夹
    TreeView无级级绑定
    C# WinForm窗口最小化到系统托盘
    [C#]实现序列号生成器
    VS2005小技巧收集(一)
    Failed TO CREATE LOGFILE GROUP解决
  • 原文地址:https://www.cnblogs.com/zyyhxbs/p/11051790.html
Copyright © 2020-2023  润新知