函数
函数的定义
def bjdx (x,y):
"比较两个数的大小,输出大的值"
if x>y:
return(x)
else:
return(y)
def 定义函数的关键字
bjdx 自己定义的函数名
(x,y) x,y代表传进的参数
“” 函数功能说明,运行代码时没有作用,仅增加程序可读性
if x>y: #程序代码块
return(x) #返回值
else:
return(y)
*返回多个值时,将多个值放入一个元组,并返回,如果没有返回语句则返回None值。
>>> def a():
pass
>>> print(a())
None
>>>
函数的调用
函数名()
函数名后加一个括号,括号里面可加参数
bjdx(1,2)#调用上面定义的函数
*函数的调用要在函数定义之后
参数
形参和实参
1、形参
形参只有被调用时,才分配内存空间,调用结束时,则释放空间,所以形参只有函数内部有效。
def bjdx (x,y):#x,y就是形参
"比较两个数的大小,输出大的值"
if x>y:
return(x)
else:
return(y)
2、实参可以是常量,变量,表达式,函数,在调用之前,进行赋值操作。
def bjdx (x,y):
"比较两个数的大小,输出大的值"
if x>y:
return(x)
else:
return(y)
bjdx(1,2)#1,2就是实参
位置参数和关键字参数
位置参数
>>> def handl(x,y,z):
pass
>>> handl(1,2,3)
>>> handl(1,2,3,4)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
handl(1,2,3,4)
TypeError: handl() takes 3 positional arguments but 4 were given
>>> handl(1,2)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
handl(1,2)
TypeError: handl() missing 1 required positional argument: 'z'
>>>
handl(1,2,3)中的1,2,3就是位置参数,和自定义handl中的x,y,z通过位置一一对应,不能多,也不能少,否则报错。
关键字参数
>>> def printf(x,y,z):
print(x,y,z)
>>> printf(x=1,y=2,z=3)
1 2 3
>>> printf(x=1,z=3,y=2)
1 2 3
>>>
printf(x=1,y=2,z=3),其中的参数就是关键字参数,也必须一一对应,但是通过关键字实现实参和形参的对应关系。
混合传参
>>> def printf(x,y,z):
print(x,y,z)
>>> printf(1,y=2,z=3)
1 2 3
>>> printf(1,z=3,y=2)
1 2 3
>>> printf(x=1,2,3)
SyntaxError: positional argument follows keyword argument
>>> printf(1,y=2,3)
SyntaxError: positional argument follows keyword argument
>>> printf(1,y=2,z=3,y=3)
SyntaxError: keyword argument repeated
>>>
通过上面的代码,我们可以总结一些混合传参的规则:
1、参数数量还是一一对应关系,一个参数不能传两次。
2、位置参数必须先传,即位置参数必须在关键字参数的左边
默认参数
>>> def printf(x=1,y=2,z=3):
print(x,y,z)
>>> printf()
1 2 3
>>> printf(2,3,4)
2 3 4
>>>
def printf(x=1,y=2,z=3)默认参数就是在定义函数时,就进行赋值的参数,此时不用传参,就可以运行程序,也可以通过传参去修改形参对应的实参。
参数组
- 和元组有关
在定义函数时,如果参数名前面加’*’,则表示该参数是一个可变参数,在满足函数调用所需参数后,剩下的参数会以元组的形式收集在参里面。
>>> def printf(x,*s):
print(x,s)
>>> printf(1,2,3)
1 (2, 3)
>>> printf(1,2,(3,4,5))#可以收集几乎所有类型的参数,除字典。
1 (2, (3, 4, 5))
>>> printf(1,2,'sd':d)#收集字典时报错
SyntaxError: invalid syntax
>>>
- ** 和字典有关
用来收集关键字参数,字典的类型存放在该参数中,调用时和调用字典类型参数无异。
>>> def printf(x,**s):
print(x,s)
print(s['key1'])
>>> printf(1,key1='密码1',key='密码2')
1 {'key1': '密码1', 'key': '密码2'}
密码1
- 注意:
两种不同类型的收集参数,如果要一起使用,带一个*号的收集参数必须在带两个**收集参数的左边,否则报错。符合位置参数在关键字参数左边的大前提。
>>> def printf(x,*s1,**s2):
print(x,s1,s2)
>>> printf(1,2,3,key1=(4,5,6))
1 (2, 3) {'key1': (4, 5, 6)}
>>>
全局变量和局部变量
全局变量
全局变量就是顶格定义的变量,其作用范围是全局,在函数中也可以随时调用使用。
name = '全局变量'
def handl():
print(name)
handl()
>>> 全局变量
局部变量
局部变量就是使用空格后定义的变量,它的作用域仅作用在所在的函数内,超出函数范围,调用无效。
def handl():
name = '局部变量'
print(name)
handl()
>>>局部变量
global
>>> name = '全局变量'
>>> def handl():
name = '局部变量'
print(name)
>>> handl()
局部变量
>>> print(name)
全局变量
>>>
根据上面的代码,我们可以看出,当局部变量和全局变量重名时,在局部优先调用局部变量,而全局变量不发生改变。那有没有办法在函数外部调用局部变量呢?
>>> name = '全局变量'
>>> def handl():
global name#将name作用于全局
name = '局部变量'#更改全局变量
print(name)
>>> handl()
局部变量
>>> print(name)
局部变量
>>>
总结
全局变量尽量不要和局部变量重名,避免发生一些意外错误。
统一规范:全局变量用大写字母表示,局部变量用小写字母表示。