一.return 返回值
自定义函数的返回值,return 可以把值返回到函数的调用处
(1) return + 六大标准数据类型 , 还有类和对象,函数
如果不定义return , 默认返回的是None
(2) 在执行完return之后,立刻终止函数,后面的代码不执行
模拟简单的计算器 + - * /
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在函数内部定义(全局命名空间)
作用域: 作用的范围
局部变量作用域: 在函数的内部
全局变量作用域: 横跨整个文件
生命周期:
内置变量 > 全局变量 > 局部变量
1.局部变量
def func():
# 定义局部变量
a = 5
# 获取局部变量
print(a)
# 修改局部变量
a = 10
print(a)
func()
# print(a) error 不能再全局调用局部变量
2.全局变量
# 定义全局变量
b = 10
# 获取全局变量
print(b)
# 修改全局变量
b = 20
def func():
# 可以在函数内部获取全局变量
print(b)
func()
3.使用global在函数内部创建全局变量
def func():
global c
c = 200
func()
print(c)
4.使用global在函数内部修改全局变量
d = 300
def func():
global d
d = 400
func()
print(d) # 400
总结:
可以使用global 关键字在函数内部定义一个全局变量
也可以使用global关键字在函数内部修改一个全局变量
三.函数名的使用
1.函数名是个特殊的变量,可以当做变量赋值
函数可以像变量一样销毁
del 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()
"""
<function func1 at 0x000001561BB31F28>
我是func1函数
<function func2 at 0x000001561BD0A158>
我是func2函数
<function func3 at 0x000001561BECD620>
我是func3函数
"""
3.函数名可以作为函数的参数
def func1():
print("我是func1函数")
def func2():
print("我是func2函数")
def func3():
print("我是func3函数")
def func4(f):
f()
func4(func3)
# 我是func3函数
4.函数名可作为函数的返回值
def func1():
print("我是func1函数")
def func2():
print("我是func2函数")
def func3():
print("我是func3函数")
def func(f):
return f
res = func(func2)
res()
# 我是func2函数
四.doc 或者 help查看文档
def eat_bigchang(something):
"""
功能: 大肠刺身
参数: 肠子名字
返回值: 吃的状态
"""
print("先把{}洗一洗".format(something))
print("找出肠子头放嘴里")
print("嘬!!")
return "吃完了,满意的放下肠子,擦擦嘴"
res = eat_bigchang("猪肠子")
print(res)
help(eat_bigchang)
res = eat_bigchang.__doc__
print(res)
五.函数的嵌套
函数之间可以互相嵌套
外层的叫做外函数
内层的叫做内函数
(1)内部函数可以直接在函数外部调用吗 不行!
(2)调用外部函数后,内部函数可以在函数外部调用吗 不可行!
(3)内部函数可以在函数内部调用吗 可以!
(4)内部函数在函数内部调用时,是否有先后顺序 有! 必须先定义再调用
外层是outer , 内层是inner ,最里层是smaller,调用smaller里面的所有代码
def outer():
def inner():
def smaller():
print("我是smaller函数" , id)
smaller()
inner()
outer()
LEGB 原则 (就近找变量原则)
找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— 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()
# 400 400 400
(3) 注意点:nonlocal只能修改局部变量
# 最后什么也没有,直接报错
a = 100
def outer():
def inner():
def smaller():
nonlocal a
a = 400
print(a)
smaller()
print(a)
inner()
print(a)
outer()
(4) 不使用nonlocal 修改局部变量
def func():
lst = [1,2,3,4]
def inner():
lst[-1] = 10
inner()
print(lst)
func()
# [1, 2, 3, 10]
七.locals 和 globals (了解)
locals 获取当前作用域中所有变量
locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在局部,调用locals之后,获取的是locals调用之前的所有变量,返回字典,局部空间作用域
# 例子1
def func():
ff = 123
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000025C21CDB278>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/培训/所有代码/day11/1.py', '__cached__': None, 'func': <function func at 0x0000025C21BD1F28>, 'a': 1, 'b': 2, 'res': {...}, 'c': 3}
# 例子2
a1 = 10
def func():
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
a2 = 20
func()
a3 = 30
# {'b': 2, 'a': 1}
globals 只获取全局空间中所有变量
globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
# 例子1
def func():
ff = 123
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000014D6956B278>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/培训/所有代码/day11/1.py', '__cached__': None, 'func': <function func at 0x0000014D69461F28>, 'a': 1, 'b': 2, 'res': {...}, 'c': 3}
# 例子2
a1 = 10
def func():
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
a2 = 20
func() # globals
a3 = 30
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001621179B278>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/培训/所有代码/day11/1.py', '__cached__': None, 'a1': 10, 'func': <function func at 0x0000016211691F28>, 'a2': 20}
八.globals 动态批量创建全局变量
1.用字符串定义全局变量
在全局的字典当中,通过添加键值对,自动创建全局变量
2.批量定义全局变量
def func():
dic = globals()
# 通过在全局系统字典当中,添加键值对,批量创建变量
for i in range(1, 6):
# "a%d" % (1) => "a1" "a%d" % (2) => "a2"
dic["a%d" % (i)] = i # 1~5
print(dic)
func()
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001565533B278>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/培训/所有代码/day11/1.py', '__cached__': None, 'func': <function func at 0x0000015655231F28>, 'a1': 1, 'a2': 2, 'a3': 3, 'a4': 4, 'a5': 5}