第六章 函数-下
原文再续,书接上一回
6.3 我的地盘听我的
6.3.1 函数和过程
函数和过程的区别
- 函数是有返回值的
- 过程是简单、特殊并且没有返回值的
Python严格来说只有函数,没有过程。函数默认会有返回值
>>> def hello():
print('Hello')
>>> print(hello())
Hello
None
通过上面小demo可以看出当不写return语句时,默认Python会认为函数是return None。所以说Python所有的函数都有返回值。
6.3.2 再谈一谈返回值
Python同时返回多个值,使用列表或元组打包
Python利用列表打包多种类型的值一次性返回
>>> def test():
return [1,2,3,4,5]
>>> test()
[1, 2, 3, 4, 5]
6.3.3 函数变量的作用域
变量的作用域就是平时所说的变量可见性。一般的编程语言都有局部变量(Local Variable)和全局变量(Global Variable)之分
通过下面的小demo来学习(可以先把最后面那一条语句注释掉,运行一下先):
def discounts(price,rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('打折后价格是:',new_price)
print('这里试图打印局部变量final_price的值:',final_price)
运行整个文件的结果,程序有出错:
请输入原价:80
请输入折扣率:0.75
打折后价格是: 60.0
Traceback (most recent call last):
File "F:/零基础入门学习python-小甲鱼/p6_2.py", line 9, in <module>
print('这里试图打印局部变量final_price的值:',final_price)
NameError: name 'final_price' is not defined
解释一下函数discounts里面的三个参数都是局部变量。
错误原因:final_price没有被定义过,也就是说Python找不到final_price这个变量。这是因为final_price只是一个局部变量,它的作用范围只在它的地盘上,超出了这个范围,它将什么都不是。
总结:
- 在函数里边定义的参数以及变量,都称为局部变量,出了这个函数,这些变量都是无效的。
- 事实上的原理是,Python在运行函数的时候,利用栈(Stack)进行存储,当执行该函数后,函数中的所有数据都会被自动删除。所以在函数外边是无法访问到函数内部的局部变量的。
全局变量:
全局变量拥有更大的作用域,例如可以在函数中可以访问到它们
如果在函数内部试图修改全局变量,那么Python会创建一个新的局部变量替代(名字跟全局变量相同),但是真正的全局变量是没有被改变的。
def discounts(price,rate):
final_price = price * rate
old_price = 50 #在这里试图修改全局变量
print('在局部变量中修改后的old_price的值:',old_price)
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price,rate)
print('全局变量old_price的值:',old_price)
print('打折后价格是:',new_price)
运行整个文件的结果:
请输入原价:80
请输入折扣率:0.75
在局部变量中修改后的old_price的值: 50
全局变量old_price的值: 80.0
打折后价格是: 60.0
全局变量的总结:
全局变量在整个代码段中都是可以访问到的,但是不要试图在函数内部去修改全局变量的值
6.4 内嵌函数和闭包
6.4.1 global 关键字
全局变量的作用域是整个模块(整个代码段),也就是代码段内所有的函数内部都可以访问全局变量。
PS.函数内部仅仅去访问全局变量就好,不要试图去修改它。
再说一下:
Python会使用屏蔽的方式”保护”全局变量,一旦函数内部试图修改全局变量,Python就会在函数内部自动创建一个名字一模一样的局部变量,这样修改的结果只会修改到局部变量,而不会影响到全局变量。
小demo:
>>> count = 5
>