动态传参(重点)  *, **
*, ** :
形参: 聚合
    位置参数* -> 元组
    关键字** -> 字典
实参: 打散
    列表, 字符串, 元素 -> *
    字典 -> **
形参的顺序(重点):
  位置  *args(位置参数动态传参)  默认值  **kwargs(关键字动态传参)
以后写参数. 可以随意的进行搭配, 但是, 顺序不能串
* 在形参位置. * 表示不定参数-接收的是位置参数
接收到的位置参数的动态传参: 都是元组
def chi(*food): # 在形参这里把传递过来的实参进行了聚合,聚合成了元组
    print(food)
**在形参表示动态传参-关键字参数
关键字动态传参接收到的是字典
def func(**kwargs):  # 也是聚合. ** 聚合成字典
    print(kwargs)
# 无敌传参
def func(*args, **kwargs): # 参数没有限制. 随便传递
    print(args)
    print(kwargs)
 
形参:
  *->元组, **->字典 表示聚合
实参:
  *->列表,字符串,元组, **->字典 表示打散
名称空间: 用来存放名字(变量, 函数名, 类名, 引入的模块名)的
1. 全局名称空间: 我们在py文件中自己写的变量, 函数.....
2. 内置名称空间: 我们python解释器提供好的一些内置内容(print, input....)
3. 局部名称空间: 在我们执行函数的时候.会产生一个局部名称空间. 放的是: 函数内部的内容(变量, 函数,类...)
名称空间可能会有无数个, 局部名称空间而言. 相对是独立的.一般互不干扰
作用域:
1. 全局作用域: 内置+全局
2. 局部作用域: 局部
globals() 查看全局作用域
locals() 查看当前作用域
 
从全局去找局部 -> 找不到
局部去找全局 -> 可以找到
# print(locals()) # 全局
# print(globals()) # 全局
globals() 查看全局作用域      locals() 查看当前作用域
 
函数的嵌套
在函数中声明函数
在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置
函数的嵌套:
def func1():
    print("1")
    def func2():
        print("2")
        def func3():
            print("3")
        print("4")
        func3()
        print(5)
    print("6")
    func2()
    print("7")
func1()
# 1
# 6
# 2
# 4
# 3
# 5
# 7
 
全局变量一般是不能随意的修改的
a = 10
def func():
    # 慎用.
    global a  # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量
    a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在视图改全局变量
    print("里面的打印",a)
func()
print("外面的打印", a)
# 里面的打印 20
# 外面的打印 20
 
 
nonlocal  在局部, 寻找离他最近的外层的一个变量
a = 50
def func1():
    # a = 10 # 局部
    def func2():
        nonlocal a # 不找全局, global找全局
        a += 10 # a = a + 10 python不让这么干
        print("func2", a)
    func2()
    print(a)
func1()
print(a)                 这里会报错
从全局去找局部 -> 找不到
局部去找全局 -> 可以找到
 
# 如果没有nonlocal和global 查找变量的顺序: 自己, 上一层, 上一层, 上一层
global的用法:
当需要用户贴吧需要登录才能发帖的时候需要改变全局的变量
flag = False
def login():
    global flag
    uname = input("用户名:")
    upwd = input("密码:")
    if uname == "alex" and upwd == "123":
        flag = True
    else:
        flag = False
def fatie():
    if flag == True:
        print("可以发帖")
    else:
        print("滚去登录")
login()
fatie()
fatie()
fatie()
fatie()