函数传参的规范及使用 名称空间 作用域 全局局部作用域
# 实参就是传递的数
# 行参就是函数定义的变量
# 传递的数值是表达式也没关系只要得到的是一个值即可传递
#大前提: 混合使用注意 位置实参必须在关键字形参之前
#行参传值多一个不行少一个也不行
# 关键之实参可以打破位置的限制
#不可多个值传入一个行参(不可重复传值) 、
# 默认参数的值是在定义的时候被赋予的
# 位置形参必须在位置 形参左边
# 默认参数可以先定义 (先赋值)后需要改动可以关键之传参覆盖
# 每次定义的时候默认的值是得到一个值得内存地址 注意不可变和可变的值大的情况发生(可变类型定义后在传入值是同一个内存地址是可以被改变的 )
# 规范形参不推荐传输可变的列表等
# 规范使用 *args 默认接收溢出的位置参数 用于不确定接收的函数多少 注意位置形参保存*args输出的是元组的形式
#
# 规范**kwargs 默认接收溢出的关键字形参 一字典的方式输出 调用直接使用变量名即可
# *和**都可以在 *实参中 列表元组将被一个个遍历出来 **实参中把字典可以拆分成关键字参数输出
# 混用*与**:*args必须在**kwargs之前
# def index(x,y,z): # print("输出",x,y,z) # def account(*args,**kwargs): #收到值输出为元组和字典 # index(*args,**kwargs) #但是使用*和** 实参的传输拆分很完美的解开 再传递 # account(1,z=2,y=123) #注意大前提的传参的必须遵守
# 函数补充(了解)
# 命名关键字(x,y,*,a,b)a,b必须用关键字参数 可以有默认值
# 组合使用(x,y,*args ,a,**kwargs)
# 名称空间
# 创建时间
# 内置名称空间(input,print等)>全局名称空间(if for 等 内的子if 和里面的)>局部名称空间(调用函数时才会产生 函数内的)
# 名称空找值的顺序 (优先级)
# 局部>全局>内置(一层一层网上找)
# if 12>2: # zip=123 #这也算全局变量 # 上下连接的我分开简答的试验一下 # def func(): # print(zip) # func() # zip=123 不可定义到调用函数后
# 名称空间的嵌套 调用关系是以函数定义阶段为准
# x=1 # def func(): # print(x) 打印的的是x=1(所以说明函数定义阶段为准) # def foo(): # x=3 # func() # foo()
# 先定义后使用(错误示范)
# x=123
# def func():
# print(x) 应该先定义后使用
# x=456 先扫描一遍发现自己有发然后不会取外面找但是后定义的不就可以输出 #自行理解 可以找到456但是顺序不同会出现报错
# func()
# 名字的查找顺序依据定义为准(重点)
# 作用域(作用范围)
# 二:作用域-》作用范围
# 全局作用域:内置名称空间、全局名称空间
# 1、全局存活
# 2、全局有效:被所有函数共享
# 全局都可调用
# 局部作用域: 局部名称空间的名字
# 1、临时存活
# 2、局部有效:函数内有效
# LEGB
# # builtin
# # global
# def f1():
# # enclosing
# def f2():
# # enclosing
# def f3():
# # local
# pass
# --------------------------------------------------------------------------------
# # globals()调用全局 改变的值应为不可变类型 如果为可变类型可直接append直接添加不需要声明 因为是添加到旧值 而不是创建一个新值
# x=11 # def func(): # x=456 # def foo(): # global x # x=132 # foo() # print(x) #这是打印func里的x # print(x) #这是在foo里的x 修改之前打印出的全局变量 # func() # print(x) #这是在函数调用关闭后修改了全局变量值
# # nonlocal()调用上一级(了解)
# x=11 # def func(): # # x=456 # def foo(): # nonlocal x #调用上一级的同名变量(如果嵌套函数外层一直没找到的话就会直接报错 不会调用到全局变量) # x=132 # foo() # print(x) #这是在foo调用结束后打印func的值 # print(x) # func() # print(x)