# ### return 返回值
"""
自定义函数的返回值,return 可以把值返回到函数的调用处
(1) return + 六大标准数据类型 , 还有类和对象,函数
如果不定义return , 默认返回的是None
(2) 在执行完return之后,立刻终止函数,后面的代码不执行
"""
1.return的返回类型
def func(): # return 1 # return 3.14 # return "abc" # return [] # return () # return {"a":1} pass res = func() # 如果不定义return , 默认返回的是None print(res) # None
2.在执行完return之后,立刻终止函数,后面的代码不执行
def func(): print(1) print(2) return 3 print(4) print(5) res = func() print(res) def func(): for i in range(3): if i == 2: return 1 print(i) res = func() print(res)
3.模拟简单的计算器 + - * /
def func(sign,num1,num2): if sign == "+": res = num1 + num2 elif sign =="-": res = num1 - num2 elif sign == "*": res = num1 * num2 elif sign == "/": if num2 == 0: return "除数不能为0 , 脑弟!" res = num1 / num2 else: return "这个本计算器真算不了" return res res = func("+",3,5) res = func("-",10,20) res = func("*",10,20) res = func("/",20,10) res = func("/",20,0) res = func("&",20,0) print(res)
# ### 全局变量 和 局部变量
"""
局部变量:在函数内部定义的变量(局部命名空间)
全局变量:在函数外部定义的或者使用global在函数内部定义(全局命名空间0
作用域:作用的范围
局部变量作用域:在函数的内部
全局变量作用域:横跨整个文件
生命周期:
内置变量> 全局变量> 局部变量
"""
1.局部变量
def func(): # 定义局部变量 a = 5 # 获取局部变量 printa(a) # 修改局部变量 a = 10 print(a) func() # print(a) error 不能在全局调用局部变量
2. 全局变量
# 定义全局变量 b = 10 # 获取全局变量 print(b) # 修改全局变量 b = 20
3.使用global在函数内部创建全局变量
def func(): # 可以在函数内部获取全局变量 d = 300 def func(): global c c = 200 func() print(c)
4.使用global在函数内部修改全局变量
d = 300 def func(): global d d = 400 func() print(d)d = 300 def func(): global d d = 400 func() print(d)
"""
总结:
也可以使用global关键字在函数内部定义一个全局变量
也可以使用global关键字在函数内部修改一个全局变量
"""
# ### 函数名的使用
1.函数名是个特殊的变量,可以当做变量赋值
a = "你好" print(a) a = func a() # 函数可以像变量一样销毁 del a # a()
2.函数名可以作为容器类型数据的元素
def func1(): print("我是func1函数") def func2: print()("我是func2函数") def func3(): print("我是func3函数") lst = [func1,func2,func3] for i in lst: print(i) i() #func1() func2() func3()
3.函数名可以作为函数的参数
def func4(): f() func4(func3)
4.函数名可作为函数的返回值
def func(func2): return f res = func(func2) #f <=> func2 <=> res = func2() res() # ###__doc__或者 help 查看文档 dfe eat_bigchang(something): """ 功能:大肠刺身 参数:肠子名字 返回值:吃的状态 """ print("先把肠子洗一洗".format(something)) print("找出肠子头发嘴里") print("嘬!!!") return("吃完了,满意的放下肠子,擦擦嘴") res = eat_bigchang("猪肠子") print(res) help(eat_bigchang) res = eat_bigchang.__doc__ print(res)
# ### 函数的嵌套
"""
函数之间可以互相嵌套
外层的叫做外函数
内层的叫做内函数
"""
def outer(): def inner(): print("我是inner函数") inner() outer()
(1)内部函数可以直接在函数外部调用吗 不行!
(2)调用外部函数后,内部函数可以在函数外部调用吗 不可行!
(3)内部函数可以在函数内部调用吗 可以!
(4)呢不函数在函数内部调用时,是否有先后顺序 有!必须先定义再调用
# 外层是outer,内层是inner,最里层是smaller,调用smaller里面的所有代码 def outer(): def inner(): def smaller(): print("我是smaller函数",ccid) smaller() inner() outer()
LEGB原则(就近找变量原则)
"""
# 找寻变量的调用顺序采用LEGB原则 (即就近原则)
B-Builtin(Python);Python内置模块的命名空间 (内建作用域)
G-Global(module);函数外部所在的命名空间 (全局作用域)
E-Enclosing function locals;外部嵌套函数的作用域 (嵌套作用域)
B-Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里往外 依次寻找
"""
# ### nonlocal 修改局部变量
"""
nonlocal遵循LEGB就近找变量原则
(1)找当前空间上一层的局部变量进行修改
(2)如果找不到,会继续向上寻找
(3)最好什么也没有,直接报错
"""
(1)找当前空间上一层的局部变量进行修改
def outer(): a=100 def inner(): nonlocal a a=200 print(a) inner() print(a) outer()
(2)如果找不到,会继续向上寻找
def outer(): a=100 def inner(): def smaller(): nonlocal a a = 400 print(a) smaller() print(a) inner() print(a) outer()
(3)注意点:nonlocal只能修改局部变量
# 最后什么也没有,直接报错 """ a= 100 def outer(): def inner() def smaller(): nonlocal a a = 400 print(a) smaller() print(a) inner() print(a) outer() """ # 400 400 400 # 500 400 400 # 400 400 500
(4)不能使用nonlocal修改拒局部变量
def func(): lst = [1,2,3,4] def inner(): lst[-1]=10 inner() print(lst) func()
# ### locals 和 globals
locals 获取当前作用域中所有变量
"""
locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域
"""
# 例子1 """ def func(): ff = 123 a=1 b=2 res = locals() c = 3 print(res) d = 4 """ # 例子2 """ a1 = 10 def func(): a = 1 b = 2 res = locals() c = 3 print(res) d = 4 a2 = 20 func() a3 = 30 """
globals 只获取全局空间中所有变量
"""
globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
"""
# 例子2 a1 = 10 def func(): a = 1 b = 2 res = globals() c = 3 print(res) d = 4 a2 = 20 func() globals a3 = 30