马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 向西而笑 于 2017-7-22 17:19 编辑
这两节课时尤其是那个闭包实在不好理解,@醉酒青牛 写的笔记给了我很大的帮助,非常感谢
------------------------------------------------------------------------------------------------------
Python只有函数没有过程Python函数就算如果没有用return返回某个值,它还是有返回值的,返回值是none,例如:
>>> def cul():
1+2
>>> cul()
>>> type(cul)
<class 'function'>
>>> print(cul())
None
函数可以返回多个值利用列表元组可以返回多个值,例如:
>>> def xxx():
return 1,4.14,'哈哈'
>>> xxx()
(1, 4.14, '哈哈')
全局变量和局部变量局部变量就是函数内部定义的变量,出了这个函数外就不能调用,它的作用域是这个函数内部;全局变量就是作用域是整个代码段。例如:
>>> def discount(price,rate):
print('在函数体内访问全局变量old_price的值',old_price)
new_price = price*rate
print('这里输出局部变量new_price的值',new_price)
>>> old_price = 100
>>> discount_rate = 0.7
>>> discount(old_price,discount_rate)
在函数体内访问全局变量old_price的值 100
这里输出局部变量new_price的值 70.0
>>> print('这里试图访问函数内部变量',new_price)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print('这里试图访问函数内部变量',new_price)
NameError: name 'new_price' is not defined
当要在函数体内改变全局变量时,会生成一个名字一样的局部变量,从而达到保护全局变量的作用。如:
>>> def modify():
num = 50
print('输出全局变量letter的值',letter)
print('输出函数体内重新修改后的num的值',num)
>>> num = 100
>>> letter = 'A'
>>> modify()
输出全局变量letter的值 A
输出函数体内重新修改后的num的值 50
>>> num
100
global关键字:要想在函数体内修改全局变量,在该变量前加个global表明这个变量是全局变量,如:
>>> def myfun():
num = 100
print(num)
>>> num
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
num
NameError: name 'num' is not defined
>>> num = 0
>>> num
0
>>> def myfun():
global num
num = 100
print(num)
>>> num = 0
>>> myfun()
100
>>> num
100
内嵌函数
内嵌函数也可以叫内部函数,就是函数中的函数。内部函数作用域都在外部函数作用域之内,出了外部函数就不能调用内部函数
>>> def fun1():
print('fun1正在被调用')
def fun2():
print('fun2正在被调用')
fun2()
>>> fun1()
fun1正在被调用
fun2正在被调用
>>> fun2()
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
fun2()
NameError: name 'fun2' is not defined
闭包(closure):如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
例子1:
def fun1():
a = 2
def fun2(b):
return (a*b)
return fun2
>>> fun1()(5)
10
>>> x = fun1()
>>> x(5)
10
例子2def fun1(a):
def fun2(b):
return (a*b)
return fun2:
>>> fun1(2)(5)
10
>>> x = fun1(4)
>>> x(5)
20
nonlocal:如果想要在内部函数修改外部函数内的变量就要用到nonlocal关键字,如:
>>> def fun1():
num = 0
print('fun1中的值:',num)
def fun2():
nonlocal num
num = 100
print('fun2中的值:',num)
fun2()
print('调用fun2后的值:',num)
>>> fun1()
fun1中的值: 0
fun2中的值: 100
调用fun2后的值: 100
|