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 是局部变量,而非全局变量) 。
怎样解决这个问题?
程序3:
a=1
def a_add(x):
x+=1
return x
print('a的初值:',a)
a=a_add(a)
print('a现在的值是:',a)
运行结果:
a的初值: 1
a现在的值是: 2
结果的确是正确的,但在函数a_add(x)中没有调用变量a(没有出现变量a) 。
程序4:
a=1
def a_add(a):
a+=1
return a
print('a的初值:',a)
a=a_add(a)
print('a现在的值是:',a)
运行结果:
a的初值: 1
a现在的值是: 2
对比程序4和程序3不难发现,其实程序4只是简单的把函数的参数x变成了a,这个a的实质和程序3中的x还是一样的 。这进一步证实,函数中的a是局部变量,与主程序的全局变量a有着本质的区别 。
程序5:
a=1
def a_add():
global a
a+=1
print('a的初值:',a)
a_add()
print('a现在的值是:',a)
运行结果:
a的初值: 1
a现在的值是: 2
程序5和程序2相比较,仅仅是在函数中添加了一个定义“global a”,此时的局部变量a就可以当做全局变量使用 , 由于它和全局变量a同名 , 自然也就不用区分a究竟是全局变量还是局部变量了,在主程序和该函数内都可以访问、修改变量a的值了 。
虽然使用global可使变量使用起来非常方便,但也容易引起混淆 , 故在使用过程中还是谨慎为好 。
12.3 函数的递归与嵌套
递归,就是函数调用它自身 。递归必须设置停止条件,否则函数将无法终止,形成死循环 。
以计算阶乘为例:
def func(n):
if n==1:
return 1
else:
return n*func(n-1) #func( )调用func( )
print(func(5))
运行结果为:120
嵌套,指在函数中调用另外的函数 。这是程序中常见的一种结构,在此不再赘述 。
匿名函数
Python中可以在参数前加上关键字lambda定义一个匿名函数 , 这样的函数一般都属于“一次性”的 。
例如:
程序1:这是一个常规的函数定义和调用 。
def f_add(x,y):
return x+y
print(f_add(2,3))
输出结果:5
程序2:使用lambda定义匿名函数 。
f_add=lambda x,y:x+y
print(f_add(2,3))
输出结果:5
从上面的代码可以看出,使用lambda仅仅减少了一行代码 。f_add=lambda x,y:x+y中的f_add不是变量名,而是函数名 。程序1和程序2的print( )语句中的参数都是一样的——调用函数f_add( ) 。所以 , 匿名函数并没有太多的优点 。
python并发编程-进程池在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间 。多进程是实现并发的手段之一,需要注意的问题是:
推荐阅读
- 腾讯原创射击游戏有哪些,腾讯出版的射击游戏
- 包含苹果ios15vx刷步数的词条
- 公众号版权运营,微信公众号版权归属
- 幼儿园大班竞技类体育游戏,幼儿园大班体育竞赛游戏
- 暗影精灵怎么查询硬盘,暗影精灵5预留硬盘位
- 特工动作训练游戏,特工动作训练游戏叫什么
- 毕业设计用的什么软件编程,毕业设计用什么软件写
- 怎么调出mysql界面 mysql操作界面
- js获取一星期的时间,js获取时间方法