模块化编程指把程序进行封装(函数封装,面向对象,文件。。。)

函数

什么是函数?

function -> 函数,功能 函数就是一个具有特定功能的代码块

函数的作用?

函数就是把代码进行封装,以提高代码的重用性,提高开发效率,并且降低了后期的维护成本

函数的定义和使用

  1. # 定义函数【基本结构】
  2. def 函数名([参数列表]):
  3. 当前函数的具体功能的代码
  4. 当前函数的具体功能的代码
  5. 。。。。
  6. # 函数封装完并不会执行,只是把函数定义了而已
  7. # 如果想使用定义的函数,那么就需要用语法来进行函数的调用
  8. # 函数的调用
  9. 函数名()

函数的特征及注意事项

  1. 函数定义后,不调用不执行
  2. 不能在函数定义前调用函数
  3. 函数的调用不受次数影响
  4. 函数的命名要遵守命名规范
    • 字母数字下划线,不能以数字开头
    • 严格区分大小写,不能使用关键字
    • 命名最好有意义,且不要使用中文
  5. 函数名不要冲突,冲突后会被覆盖

关于函数的参数

函数在定义时,可以在参数列表的位置定义形参 如果函数有形参,那么在函数调用时也需要给定参数 实参将值传递给形参的过程,本质上就是变量赋值操作

(1)函数参数概念及分类

  1. 函数参数:调用时需要传递的数据.
  2. 函数参数大类分为形参和实参:
  3. . 形参意思: 函数定义时的参数
  4. . 实参意思: 函数调用时的参数
  5. 形实关系:函数调用时,形参和实参个数需要一一对应
  6. 形参种类: 普通参数,默认参数,普通收集参数,命名关键字参数,关键字收集参数
  7. 实参种类: 普通实参,关键字实参

(2)普通参数

(位置参数)普通的参数,接收实参传递的值

(3)默认参数:

位于普通参数后面,具有默认值的参数 语法:(x,y=2) y就是默认参数

(4)收集参数:

专门收集在函数调用时传递的多余的实参

  1. 1.普通收集参数:专门用于收集多余的普通参数,形成一个新的元组
  2. 语法:参数前面加* 例:*args
  3. 2.关键字收集参数:用于专门收集多余关键字实参,形成一个新的字典
  4. 语法:参数前面加** 例:**kwargs

(5)命名关键字参数

定义时放在*号后面的参数,调用时强制必须传入指定参数名才能调用

  1. 语法:(a,*,x) x是命名关键字参数
  2. 如果函数参数中已经有了收集参数,那么收集参数后面的参数即为命名关键字参数
  3. 语法:(*args,x,y)

(6)形参声明的位置顺序:

普通参数 -> 默认参数 -> 收集参数 -> 命名关键字参数 -> 关键字收集参数

  1. def func(a,b,c=1,*args,d,**kw)
  2. a,b为普通参数,c是默认参数,args是收集参数,d是命名关键字参数,kw是关键字收集参数
  3. 极少出现五种参数同时出现的情况
  4. def func(a,b=2,*,c,d,**kw)
  5. a为普通参数,b是默认参数,cd是命名关键字参数 kw是关键字收集参数

所有参数的摆放问题

  • 实参:普通实参在前,关键字参数在后
  • 形参:
    • 关键字收集参数一定在最后出现
    • 收集参数推荐在普通参数之后使用
  • 推荐顺序:普通形参,收集参数,关键字收集参数

函数返回值

一个函数除来可以完成一定功能之外,还可以按需要返回一些内容 函数中使用 return 关键字来指定返回数据,可以返回任意类型的数据 函数的返回值,会把数据返回到调用处,可以使用变量接收,或其它处理

  1. 函数可以分为两类
  2. 1。执行过程函数: 函数体内完成一定的功能既可,没有返回值
  3. 2。具有返回值的函数: 函数体内完成一定的功能,并且返回一个结果到函数调用处

return返回值的特征

  • 函数中可以使用 return 进行数据的返回
  • 可以使用return 返回 任意内容或数据
  • return 会把返回值,返回到函数调用出
  • return 意味着函数的结束,return之后的代码不在执行
  • 如果在函数中没有使用return 或者 return后面没有任何内容,那么默认返回 None
  1. # 假设有这样一个需求,定义一个函数,完成两个数的计算,并把结果输出
  2. # def jia(n1,n2):
  3. # res = n1+n2
  4. # print(res)
  5. # jia(2,5)
  6. # 需求改变,定义一个函数,完成两个数的计算,并把结果返回
  7. def jia(n1,n2):
  8. res = n1+n2
  9. return res
  10. r = jia(2,4)
  11. print(r)

变量作用域

作用域就是当前起作用,可用的范围区域 变量的有效范围

全局变量:在函数内外都可以使用的变量

局部变量:在函数内部可以使用的变量

  1. 局部变量
  2. 函数内定义的变量,局部变量,在函数外不能使用
  3. 全局变量
  4. 在函数内部使用 global 直接定义的变量,就是全局变量,函数内外都可以使用
  5. 在函数外定义的变量,在函数内使用 global 关键字进行声明,那么也是全局变量
  6. globals() 获取全局数据
  7. locals() 获取当前作用域的数据
  8. 在函数外定义的变量,函数可以访问,但是不能更改
  9. 数据类型的分类:
  10. 可变数据类型:在函数外定义的变量,在函数可以使用,
  11. 列表和字典
  12. 不可变数据类型:在函数外定义的变量,在函数内只能访问,不能使用其它操作

不光变量有作用域,函数一样也有相同的作用域

  1. def outer():
  2. print('this is outer function...')
  3. # 在函数内定义的函数,称为 局部函数,函数外无法使用
  4. def inner():
  5. print('this is inner function...')
  6. inner()
  7. outer()
  8. # inner()

nonlocal

在内函数中如何使用上一层函数中的局部变量? 在内函数中如果想使用外层函数的变量,那么需要使用 nonlocal 关键字 引用 可以引用上一层函数中定义的局部变量,但依然不能提升为全局变量

  1. # 定义一个外层函数
  2. def outer():
  3. # 外函数的局部变量
  4. num = 10
  5. # 内函数,局部函数,在函数的内部定义的函数
  6. def inner():
  7. # nonlocal 关键字在局部函数中使用,
  8. nonlocal num # 可以引用上一层函数中定义的局部变量,但依然不能提升为全局变量
  9. num += 1
  10. print(num)
  11. inner()
  12. outer()
  13. # print(num)

关于函数的文档

  1. def outer():
  2. '''
  3. 这里是让你些当前函数的文档说明的。
  4. 需要说明当前函数的作用,
  5. 如果当前函数还有行参,那么也需要对行参进行一一说明
  6. name: 这个是一个name参数,有什么作用。。。
  7. age : 这个表示当前的一个年龄
  8. :return: 此处说明当前函数的返回值。。。
  9. '''
  10. print(globals())
  11. print(__name__) # 获取当前脚本的文件名,
  12. print(__doc__) # 获取当前脚本的说明文档
  13. # print(outer.__doc__) # 获取当前函数的说明文档
  14. '''
  15. 魔术变量
  16. __name__ ==> 当前脚本如果作为主程序,那么值是 __main__,如果是当做一个模块,在另外一个脚本中引用去使用,那么值就是当前文件的名字
  17. __doc__ ==> 当前脚本的文档说明 在当前脚本当中的第一个 三引号注释就是当前脚本的说明文档
  18. {
  19. '__name__': '__main__',
  20. '__doc__': '\n在内函数中如果想使用外层函数的变',
  21. '__package__': None,
  22. '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x110444350>,
  23. '__spec__': None,
  24. '__annotations__': {},
  25. '__builtins__': <module 'builtins' (built-in)>,
  26. '__file__': '/Users/yc/Desktop/code/8.nonlocal关键字.py',
  27. '__cached__': None, 'outer': <function outer at 0x1104938c0>
  28. }
  29. '''