?).
局部作用域: 在函数内部可以使用.
作?域命名空间:
- 全局作用域: 全局命名空间 + 内置命名空间
- 局部作用域: 局部命名空间
我们可以通过globals()函数来查看全局作?用域中的内容,也可以通过locals()来查看局部作 ?用域中的变量?和函数信息
a = 10
def func():
a = 40
b = 20
print("哈哈")
print(a, b)
print(globals()) # 打印全局作用域中的内容
print(locals()) # 打印当前作用域中的内容
func()
4.函数嵌套
- 只要遇见?()就是函数的调用. 如果没有()就不是函数的调用
- 函数的执?顺序
def fun1():
print(111)
def fun2():
print(222)
fun1()
fun2()
print(111)
def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(33)
fun2()
print(555)
5.global nonlocal (很重要)
首先我们写这样一个代码, 首先在全局声明一个变?, 然后再局部调用这个变?, 并改变这 个变?的值
a = 100
def func():
global a # 加了个global表示?再局部创建这个变??. 而是直接使用全局的a
a = 28
print(a)
func()
print(a)
结果:
100
28
global表示不再使用局部作用域中的内容?. 而改用全局作用域中的变?
2.1global 宗旨
在函数内部修改全局的变量,如果全局中不存在就创建一个变量
lst = ["周道镕", "章超印", "杨红兴"]
def func():
lst.append("朱凡宇")
# 对于可变数据类型可以直接进行访问
print(lst)
func()
print(lst)
2.2 nonlocal宗旨
nonlocal 只修改上一层变量,如果上一层中没有变量就往上找一层,只会找到函数的最外层,不会找到全局进行修改
a = 10
def func1():
a = 20
def func2():
nonlocal a
a = 30
print(a)
func2()
print(a)
func1()
结果:
加?nonlocal
30
30
?加nonlocal
30
20
再看, 如果嵌套?很多层, 会是一种什么效果:
a = 1
def fun_1():
a = 2
def fun_2():
nonlocal a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a)
# 这样的程序如果能分析明白. 那么作用域, global, nonlocal就没问题?
globals()和locals()
locals() 返回是当前局部变量的深拷贝,修改locals() 中变量值的时候,实际上对于原变量本身是没有任何影响的。而globals()返回的是全局变量的字典,修改其中的内容,值会真正的发生改变。
6.其他
三元运算符
a = 10
b = 30
c = a if a > b else b
print(c)
结果:
30
enumerate() #枚举
lst = [11,22,33,44,55,66]
for i,j in enumerate(lst):
print(i,j)
结果:
0 11
1 22
2 33
3 44
4 55
5 66
元组和字典打散:
tu = (1,2,3,4,5,6)
dic = {1:2,2:4}
print(*tu)
print(*dic)
结果:
1 2 3 4 5 6
1 2
一日总结:
# 1.函数的动态参数
# *args,**kwargs (能够接受动态的位置参数和动态的关键字参数)
# 定义阶段(*args,**kwargs) 聚合
# *args - tuple
# **kwargs -- dict
# 使用阶段*args,*kwargs 打散
# *args - 源数据类型
# *kwargs - 打散是字典的键
# 优先级: 位置 > 动态位置> 默认 > 动态关键字
# lst = [12,23,3,4,5,6]
# def func(*args):
# print(*args)
# func(lst[0],lst[1]) # 笨的办法
# func(*lst)
# dic = {"key":1,"key1":34}
# def func(**kwargs):
# print(kwargs)
# func(**dic)
# 2.函数的注释
"""
每次写函数的时候需要写注释
函数名.__doc__
函数名.__name__
"""
# 3.名称空间
# 内置空间: python解释器自带的
# 全局空间:当前文件(.py文件)
# 局部空间:函数体开辟的空间
# 加载顺序: 内置 > 全局> 局部
# 取值顺序: 局部 > 全局 > 内置
# 作用域:
# 全局作用域 内置 + 全局
# 局部作用域: 局部
# 4.函数嵌套
# 函数中套函数
# 函数嵌套调用
# 函数嵌套参数的传递
# 函数嵌套返回值的传递
# 5.global nonlocal
# global : 修改全局空间的变量对应的值
# nonlocal :在外层的函数中,修改局部空间的变量值.完全不涉及全局变量,
# 只修改离它最近的一层,最近的一层没有变量继续向上找,直到找到最外层函数
# 6.三元运算符
# a = 10
# b = 20
# c = a if a> b else b
# 变量名 = 条件成立的结果 条件 条件不成立的结果