函数
1.结构化编程
将特殊的逻辑,功能性代码,单独的抽取出来,封装成函数进行调用
min([1,2,3]) ---逻辑被封装到了函数当中,调用起来非常方便简洁
2.非结构化编程
所有的代码和逻辑都在同一个代码块中
图书管理系统
逻辑比较混乱,代码量太多,太杂
函数是程序的重要组成部分
一个程序中可以有多个函数组成,多个函数相互作用
创建函数的关键字:def ---定义(动词) 函数的定义(名词)---函数的创建
函数的创建(函数的定义)
def 函数名(参数列表): #参数可以是多个,多个参数要用逗号隔开
函数的实现(核心代码)
函数调用
函数名(参数)
函数的运行机制
当调用函数的时候,解释器(pvm)会根据函数名称所定义的位置,进入到函数内部,进行执行,执行完毕后,返回到函数的调用处
函数的特点:
1.避免代码的冗余
2.提高代码的可重用性
3.提高代码的可维护性
4.提高代码的灵活性
函数定义的位置:
1.函数和全局变量类似,从文件最前端书写(没有任何缩进)
2.函数和局部变量类似,定义在其他函数内部
函数的结构
1.函数的声明(函数的定义)
def 函数名(参数列表)
返回值
2.函数的内容(实现)
核心代码
3.返回值
return 要返回的值
函数的返回值
关键字:return
return要返回的值
任何一个函数,一定有return,如果没有书写return,系统会默认添加renturn None
作用:
返回整个函数(函数不在执行)
函数的参数
1.参数的划分:
形式参数:函数声明的时候所写的参数,没有具体的值(从未使用过的标签)----简称:形参
实际参数:(让标签贴在实际参数上)---简称:实参
位置参数
参数和位置有关---参数是有顺序的---实参和形参的位置必须一一对应
位置参数不能过多,也不能过少
关键字参数
定义了关键字的参数(函数的调用---实参)
关键字参数和顺序无关---关键字必须是形式参数中定义的变量名
def fun(a,b):
print(a.b)
fun(b=10,a=20)
注意:
1.位置参数应该写在关键字参数之前,如果形参中出现了关键字参数,PVM默认认为从此往后的所有参数都是关键字参数
2.实际参数只能被赋值一次(不能被重复赋值)
def fun(a,b):
print(a,b)
fun(20,a=10)#错误,a被重复赋值
fun(10,20)
--------------------------------------
def fun(a,b):
print(a,b)
fun(a=10,a=20,b=30)#错误,关键字参数重复
默认参数
定义了默认值的参数
def fun(a,b=100):# a=10 b=100 b=20
print(a,b)
fun(10,20)
如果默认参数被传递了值,则覆盖掉以前的默认值
默认参数必须放在位置参数之后
可变长参数
收集参数----(函数的定义)
1.在参数前加*
将所有的参数,打包成元组
可以直接使用位置参数传递实参
def fun(*a):
print(a)
fun(1,2,3,4,5)
输出:#(1,2,3,4,5)
2.在参数前加**
将所有的参数,打包成字典
必须使用关键字参数传递实参
def fun(**a):
print(a)
fun(a=1,b=2,c=3,d=4,e=5)
输出: #({'a':1,'d':4,'e':5,'b':2,'c':3})
3.可变长参数在位置参数之前时,位置参数只能用关键字参数进行传值
def fun2(*a,b):
print(a)
fun2(1,2,3,4,5)
函数的文档
文档注释:'''三引号'''
函数文档必须在函数结构中的第一行出现
1.文档的导出:
函数名._doc_
2.help函数
help(函数名)
help可以自动打印文档(不用再次print)
函数和过程
1.函数
函数的声明+函数的返回值
2.过程
函数的实现(内容)
返回值
关键字:return
1.任何函数都有返回值
如果没写,系统默认添加return None
2.return之后的语句不会执行
函数的返回,依托于return
3.return之后可以跟任何数据
数字,列表,字符串,None,bool....
4.return之后可以跟表达式
5.return之后可以跟函数的调用
6.return之后可以跟一个值
间接的返回了多个值,本质上只传递了一个值
函数的变量的作用域
作用域:作用范围:命名空间
1.局部变量
1.定义在函数内部的变量称之为局部变量
2.先定义(赋值),后使用
3.从定义开始到包含它的代码块结束
2.全局变量
1.定义在文件的开头(没有任何缩进)
2.作用范围:整个文件(如果以脚本的形式运行,运行的代码可能会截断作用域)
3.局部变量和全局变量发生了命名冲突,以局部变量为优先.如果重新赋值,局部变量不会影响全局变量
原因:局部创建了一个同名的新的变量(局部变量)
global关键字
global
使用方法:
global 全局变量名
1.global 后声明的变量,叫全局变量
从本行开始该函数内部用的所有变量都是全局变量
nonlocal关键字
nonlocal
常用方法
nonlocal 外层函数的局部变量名
1.nonlocal后声明的变量,是外层函数的局部变量
从本行开始该函数内部用的所有变量都是外层函数的局部变量
nonlocal---外层函数的局部变量