def f(x,y):
z=x**2+y**2
return z
print(f(2,3)) #调用函数f(x,y)
输出结果:13
也可以通过直接给参数列表中的参数赋值的方法,为参数添加默认值,如果用户赋予参数值,则按照用户赋值执行,否则使用默认值 。例如:
def f(x,y=3):
z=x**2+y**2
return z
若调用时参数列表为(2,1),即x赋值为2,y赋值为1:
print(f(2,1))
输出结果为:5
若调用时参数列表为(2) , 即x赋值为2,y赋值省缺 , 则y使用默认值:
print(f(2))
输出结果为:13
回调函数,又称函数回调,是将函数作为另一函数的参数 。
例如:
def func(fun,m,n):
fun(m,n)
def f_add(m,n):
print('m+n=',m+n)
def f_mult(m,n):
print('m*n=',m*n)
func(f_add,2,3)
func(f_mult,2,3)
输出结果:
m+n= 5
m*n= 6
在f_add(m,n)和f_mult(m,n)被定义前,func(fun,m,n)中的fun(m,n)就已经调用了这两个函数,即“先调用后定义”,这也是回调函数的特点 。
如果无法预知参数的个数,可以在参数前面加上*号,这种参数实际上对应元组类型 。譬如 , 参会的人数事先不能确定,只能根据与会人员名单输入:
def func(*names):
print('今天与会人员有:')
for name in names:
print(name)
func('张小兵','陈晓梅','李大海','王长江')
运行后,输出结果为:
今天与会人员有:
张小兵
陈晓梅
李大海
王长江
参数为字典类型,需要在参数前面加上**号 。
def func(**kwargs):
for i in kwargs:
print(i,kwargs[i])
func(a='a1',b='b1',c='c1')
输出结果为:
a a1
b b1
c c1
一个有趣的实例:
def func(x,y,z,*args,**kwargs):
print(x,y,z)
print(args)
print(kwargs)
func('a','b','c','Python','is easy',py='python',j='java',ph='php')
输出结果:
a b c # 前三个实参赋给前三个形参
('Python', 'is easy') # *args接收元组数据
{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典数据
12.2 变量的作用域
变量的作用域即变量的有效范围 , 可分为全局变量和局部变量 。
局部变量
在函数中定义的变量就是局部变量,局部变量的作用域仅限于函数内部使用 。
全局变量
在主程序中定义的变量就是全局变量,但在函数中用关键字global修饰的变量也可以当做全局变量来使用 。
全局变量的作用域是整个程序,也就是说,全局变量可以在整个程序中可以访问 。
下面通过实例去讨论:
程序1:
a=1 # a为全局变量
def a_add():
print('a的初值:',a) # 在函数中读取a的值
a_add() # 调用函数a_add()
a+=1 # 主程序语句,a增加1
print('a现在的值是:',a) # 主程序语句,读取a的值
运行结果:
a的初值: 1
a现在的值是: 2
这个结果和我们想象的一样 , 全局变量a既可以在主程序中读取,也可以在子程序(函数)中读取 。
程序2:
a=1
def a_add():
a+=1
print('a的初值:',a)
a_add()
print('a现在的值是:',a)
运行程序1时出现如下错误提示:
UnboundLocalError: local variable 'a' referenced before assignment
意思是:局部变量'a'在赋值之前被引用 。
从语法上来讲,该程序没有错误 。首先定义了一个全局变量a并赋值为1 , 又定义了一个函数a_add(),函数内的语句a+=1就是出错的根源 , 虽然我们的初衷是想让全局变量a的值增加1,但从错误提示看,这个语句中的a并不是全局变量,而是局部变量 。看来,在函数中读取全局变量的值是没有问题的(在程序1中已经得到了验证),但要在函数中改变全局变量的值是不行的(在程序2的错误提示a+=1中的a 是局部变量,而非全局变量) 。
推荐阅读
- 抖音直播样品网址,抖音直播选品货源
- 电话通讯录的系统c语言程序,c语言通讯录系统课程设计
- 如何找视频热门话题推广,选个视频上热门
- vbnet字符串时间的简单介绍
- 魅族系统支持什么手机卡,魅族最新系统支持机型
- 路由器名称被篡改怎么恢复,路由器名称乱码怎么改
- 手机单机角色扮演射击游戏,手游单机角色扮演游戏推荐
- go语言支持的gui开发 go语言开发环境哪个版本最稳定
- 华为能登推特嘛安卓版本,华为可以使用推特吗