4.函数

函数返回值
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple

参数
位置参数调用(按照位置一一对应形参)
关键字调用(与形参顺序无关,调用时按照形参名一一赋值(x=2)),形参名赋值必须写在参数表最后
默认参数:函数定义的时候已经在参数表内将形参赋值,函数调用时不写这个默认参数将按照默认值调用,写这个参数,将以新写的这个参数值调用
参数组: (参数组一定要放在最后)定义函数用*args表示不固定个数的位置参数,转换成元组,args是变量名,调用时也可以用*来传递一个不固定个数的实参,这种不固定个数的参数表在程序里以元组存在
**kwargs字典形式的不固定个数的参数,把N个关键字参数,转换成字典
函数内部调用其他函数:被调用函数必须在调用函数的上面
示例:
列表参数:
def test(*args): #定义
print(args)
test(1,2,3,4,5,6) # 屏幕输出(1,2,3,4,5,6)
test(*[1,2,3,4,5,6]) # 屏幕输出同上
字典参数:
def test2(**kwargs): #定义
print(kwargs)
test2(name="zhang",age=8) #关键字传参形式调用 屏幕输出{"name":"zhang","age"=8}
test2(**{"name":"zhang","age"=8}) #传入字典参数调用 屏幕输出同上
与位置参数相结合:
def test3(name,**kwargs):
test3("zhang",age=8,sex="m") #第一个参数对应name,后面的需要用关键字传参或者直接传递一个字典
test3("zhang",**{"age"=8","sex"="m"})
与位置参数\关键字参数结合:
def test4(name,age=8,**kwargs)
test4("zhang",18,sex="m",hobby="game") #第一个参数对应name,第二个对应age,后面的都传递给kwargs
与位置参数\关键字参数\*args相结合
def test5(name,age=8,*args,**kwargs)
test5("zhang","18",1,2,3,set="m",hobby="game") #第一个参数对应name,第二个对应age,第三四五个对应*args,第六七个对应**kwargs,
因为*args只能接收位置参数,**kwargs只能接收关键字参数

局部变量和全局变量(在函数内部定义的变量叫做局部变量,程序一开始定义的变量叫全局变量)
全局变量的作用域是整个程序,局部变量的作用域是定义该变量的函数
当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用,在其他地方全局变量起作用

函数内部想改全局变量必须先在函数内部用 global 变量名 进行声明,再修改变量值,可以改,但是不要用这个方法改全局变量
绝对禁止函数内部声明全局变量并修改
字符串和整数不能再函数内修改
列表\字典\集合\类可以在函数内修改
在函数内部用 global 变量名 声明,该变量即为全局变量
global关键字会告诉解释器后面的变量是一个全局变量,再使用赋值语句时,就不会再创建局部变量
在开发时,应该把模块中的所有全局变量,定义在函数上方,这样才能保证所有的函数都能够正常访问到每一个全局变量
定义全局变量,可以用gl_变量名 来定义全局变量,方便阅读
代码结构:
shebang
import 模块
全局变量
函数定义
执行代码

返回值(用return语句把函数的执行结果返回)
1.函数在执行过程中只要遇到return语句,就会停止执行并返回结果,可以理解为return为函数的结束
2.如果未在函数中指定return,那这个函数的返回值为None

递归(一个函数在函数内部调用自己,那么叫递归函数)
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不够,递归层次过多会导致栈溢出












上一篇:OTS构建SpringMVC REST风格的准实时系统


下一篇:python学习笔记_集合的定义和常用方法