Python函数的返回值和作用域 函数返回值有什么用

函数的返回值和作用域
1、返回值def guess(x):if x > 3:return "> 3"else:return "<= 3"print(guess(10))
1> Python 函数使用 return 语句返回 "返回值”
2> 所有函数都有返回值,如果没有 return 语句,隐式调用 return None
3> return 语句并不一定是函数的语句块的最后一条语句
4> 一个函数可以存在多个 return 语句,但是只有一条可以被执行 。如果没有一条 return 语句被执行到,隐式调用 return None
5> 如果有必要,可以显示调用return None,可以简写为return
6> 如果函数执行了 return 语句,函数就会返回,当前被执行的 return 语句之后的其它语句就不会被执行了
7> 返回值的作用: 结束函数调用、返回 "返回值”
2、能一次返回多个值嘛?def showvalues():return 1, 3, 5print(showvalues())# 返回 (1, 3, 5)
函数不能同时返回多个值
return 1, 3, 5 看似返回多个值,隐式的被 python 封装成了一个元组
x, y, z = showvalues() 使用解构提取返回值更为方便
3、函数作用域**3.1 作用域一个标识符的可见范围,这就是标识符的作用域,一般常说变量的作用域 。
x = 20def fn():x = 100# x 的作用域:当前函数fn()print(x)# x = 20
注意:每一个函数都会开辟一个作用域 。
3.2 作用域分类全局作用域:
在整个程序运行环境中都可见
全局作用域中的变量称为全局变量
局部作用域:
在函数、类等内部可见
局部作用域中的变量称为局部变量,其使用范围不超过其所在局部作用域
# 局部变量def fn1():x = 1# 局部作用域,x 为局部变量,使用范围在 fn1 内def fn2():print(x) # x 能打印吗?不能print(x)# x 能打印吗?不能
# 全局变量x = 5# 全局变量,也在函数外定义def foo():print(x) # 可见吗?可以foo()
一般来讲外部作用域变量在函数内部可见,可以使用
反过来,函数内部的局部变量,不能在函数外部看到
4、函数嵌套在一个函数中定义另一个函数
def outer():def inner():print('inner')print('outer')inner()outer()inner()# 不可以
内部函数 inner 不能在外部直接使用,会抛出 NameError 异常,因为它在函数外部不可见 。
其实,inner 不过就是一个 标识符 ,就是一个 函数 outer 内部定义的变量 而已 。
5、嵌套函数的作用域def outer():o = 65# 局部变量、本地 local 变量、临时变量def inner():o = 97print('inner', o)print('outer 1 ', o)inner()print('outer 2 ', o)outer()# 1:outer 1652:inner 973:outer 265
外层变量在内部作用域可见 。
内层作用域中,如果定义了和外层相同的变量,相当于在当前函数作用域中重新定义了一个新的变量,这个内层变量并不能覆盖掉外部作用域中的变量 。
6、一个赋值语句的问题【Python函数的返回值和作用域 函数返回值有什么用】x = 100def fn():y = x + 200print(y)fn()
x = 100def fn():x += 1# 报错! 赋值即定义,即 x = x + 1 (局部变量 = 局部变量 + 1)!print(x)fn()
x = 100def fn():print(x)# 报错!该步执行不了!x += 1# 只要在该作用域内赋值定义('=')局部变量,在该作用域内的所有该变量都为局部变量!print(x)fn()
能否解决呢?可以,使用 global 语句
x = 100def fn():global x# 声明全局变量print(x)# 100x += 1print(x)# 101fn()print(x)# 101
注意:全局变量一般情况不推荐修改,一旦在作用域中使用 global 声明全局变量,那么相当于在对全局变量赋值、定义 。
global 使用原则:1> 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离 。
2> 如果函数需要使用外部全局变量,请尽量使用函数的形参定义,并在调用传实参解决 。
3> 一句话:不用 global,学习它就是为了深入理解变量作用域 。
# 不建议直接传入全局变量!y = []def foo():# x 就是标识符,就是变量,就是本地变量y.append(1)foo()foo()print(y)
# 建议使用传参的方式,在函数内使用全局变量y = []def foo(x):# x 就是标识符,就是变量,就是本地变量x.append(1)foo(y)foo(y)print(y)
7、闭包**自由变量:未在本地作用域中定义的变量 。例如 定义在内层函数外的外层函数的作用域中的变量。
闭包:就是一个概念,出现在嵌套函数中,指的是 内层函数引用到了外层函数的自由变量 ,就形成了闭包 。很多语言都有这个概念,最熟悉就是 JavaScript 。