python学习之函数(三)--函数与过程
1.函数与过程的区别:
有返回值的是函数,没有返回值的是过程;
函数(function):有返回值
过程(procedure):简单特殊,没有返回值
严格来说,python只有函数,没有过程。没有返回值的函数,默认有一个返回值none
2.返回值:
返回值可以是多种类型,也可以返回多个数据,可以用数组打包返回,也可以用元组一起返回,没有类型限制
3.函数变量的作用域:
局部变量(local variable):在函数中定义的参数和变量是局部变量,在函数外是无法使用的,因为函数调用完之后,栈就将函数数据清除,所以外部是无法调用的
全局变量(global variable):作用域是整个模块,整个代码都可以访问,可以在函数中使用,最好不要在函数中修改,如果在函数中修改全局变量,会在函数中,新建一个局部变量,名字和全局变量一致,但是不会影线全局变量的值
def decision(price,rate):
final_price = price * rate
old_price = 70
return final_price
old_price = float(input("输入原价:"))
rate = float(input("输入折扣:"))
print(old_price)
print("折扣价格:",decision(old_price,rate)
4.global关键字:可以用来修改成全局变量
count = 5
def test1():
count = 10
print(count)
print(count
5.内嵌函数:在函数内部定义另一个函数;
def fun1():
print("fun1()正在被调用")
def fun2():
print("fun2()正在被调用")
fun2()
fun1()
fun2()
执行结果:
fun1()正在被调用
fun2()正在被调用
Traceback (most recent call last):
File "/Users/zoezhang/PycharmProjects/learnpython/learn-内嵌函数.py", line 8, in <module>
fun2()
NameError: name 'fun2' is not defined
注意:内嵌函数在调用的时候,只能在定义函数的内部能调用,不能全局调用
5.闭包():如果在一个内部函数里,对外部作用域(但不是在全局作用域)里进行引用,则内部函数就被认为是闭包
注意:闭包是由内嵌函数演变而来,全局是不能调用闭包的
#闭包
def funx(x):
def funy(y):
return x*y
return funy
#调用方法一
print(funx(1)(2))
#调用方法二
i=funx(8)
print(i(5))
在python3之前,内部函数是不能直接更改全局变量的,会报错,需要间接使用容器类型来解决,因为容器类型不是存储在栈里,所以可以使用,更改方式如下:
#----------------
def fun1():
x=[2]
def fun2():
x[0] *= x[0]
return x[0]
return fun2()
print(fun1())
在python3之后,增加一个关键字nonlocal(同类型函数关键字glocal)
#----------
def fun1():
x=4
def fun2():
nonlocal x
x*=x
return x
return fun2()
print(fun1())
global适用于函数内部修改全局变量的值; nonlocal适用于嵌套函数中内部函数修改外部变量的值
如果没有使用以上关键字,对全局变量或者外部变量进行修改,python会默认将全局变量隐藏起来