*与**在实参中的作用
def func(*args,**kwargs):
print(args)
print(kwargs)
func() # () {}
func([1,2,3,4,5]) # ([1, 2, 3, 4, 5],) {}
l1 = [1,2,3,4,5]
func(*l1) # (1, 2, 3, 4, 5)
s = 'hello'
func(*s) # ('h', 'e', 'l', 'l', 'o')
d = {'name':'jason','age':18}
func(*d) # ('name', 'age')
func(**d) # {'name': 'jason', 'age': 18}
func(username ='jason',age =17) # {'username': 'jason', 'age': 17}
t2 = (1,2,3,4,5)
func(*t2)
'''*与**在行参的作用
* :接受多余的位置参数,并组织成元组的形式赋值给*后面的变量名
**:接受多余的关键字参数,并组织成字典的性质赋值给**号后面的变量名
'''
'''*与**在实参的作用
*: 将实参中的容器中的所有元素一一传入位置参数(*号在实参中类似于for循环)
**:将实参中的字典的kv键值对一一传入关键字参数
'''
命名关键字参数
def func(a,b,*args):
pass
func(1,b=222)
'''需要行参在传实参的时候,必须要按照关键字参数才可以
'''
# 在行参*args的后面
def func(a,b,*args,c):
print(a,b,args,c)
# func(1,2,3,4,5) # 报错
func(1,2,3,4,5,c=100) # 1 2 (3, 4, 5) 100
# 如果行参中还有**kwargs,那必须在它的后面
def func(a,b,*args,c,**kwargs):
pass
func(1,2,3,4,c=100,name ='jason')
名称空间
就是用来存反复变量名于数据值之间绑定关系的地方
"""
name = 'jason'
在内存中申请一块内存空间存储jason,然后绑定变量名name
变量名name与值的绑定关系就被存储到名称空间中,之后使用名字都是去名称空间中查找并锁定对应的数据值
del name
删除的不是数据值,而是变量名以及变量名与数据值之间的绑定关系
"""
# 1.名称空间的分类
'内置名称空间'
python解释器运行就会立刻创建的空间
写代码过程中可以直接使用的名字都在该空间中
eg:len() print() input()...
'全局名称空间'
py文件运行代码过程中产生的名字都会存入该空间
普通代码里面的变量名
分支结构里面的变量名
循环结构里面的变量名
定义函数的函数名
定义类的类名
'局部名称空间'
函数体代码运行过程中产生的名字都会存入该空间
# 2.名称空间的存活周期
内置名称空间
解释器运行(创建) 解释器关闭(销毁)
全局名称空间
py文件运行(创建) py文件结束(销毁)
局部名称空间
函数体代码运行(创建) 函数体代码结束(销毁)
名字的查找顺序
"""查找名字之前一定要看自己在哪个名称空间"""
1.当前在全局名称空间
全局名称空间-->>:内置名称空间
2.当前在局部名称空间
局部名称空间-->>:全局名称空间-->>:内置名称空间
名称空间的作用域
1.内置名称空间
在程序任意位置都可以使用(全局有效)
2.全局名称空间
在程序任意位置都可以使用(全局有效)
3.局部名称空间
在各自的局部空间可以使用(局部有效)
局部名称空间复杂情况
# 1.各自局部名称空间默认情况下不能彼此共享名字
def fun1():
name = 'jason'
print(age)
def fun2():
age = 18
print(name)
fun1()
fun2() # 报错
# 2.特殊情况
x = 1
def func1():
x =2
def func2():
print(x) # 特例, pycharm识别到局部名称空间中print(x)下面有赋值的变量x,所以报错
x =3
func2()
func1()
global与nonlocal关键字
'1.global'
# money =1000
# def index():
# global money # 申明局部空间的money操作的是全局的money
# money = 10000
# print(money)
# index()
# print(money)
"""
正常情况下,局部名称空间里面出现的新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字,这样其他局部
名称空间可以使用这个名字
"""
# l1 = [1,3,4,5,6]
# s = '$jason$'
# def func():
# global s
# s =s.strip('$')
# print(s) # jason
# l1.append(1000)
# func()
# print(l1) # [1, 3, 4, 5, 6, 1000]
# print(s) # jason
"""
局部修改全局名称空间中不可变类型的数据,需要使用关键字global申明
如果是可变类型,则无需关键字申明
"""
'2.nonlocal'
def func1():
x = 1
l1 = [1,2,3,4,5]
def func2():
nonlocal x
x =1000
l1.append(1000)
func2()
print(x) # 1000
print(l1) # [1, 2, 3, 4, 5, 1000]
func1()
"""
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
"""
函数名的多种使用方式
def func():
print('from func')
# 1.函数名也可以被用来多次赋值(函数名与变量名使用一致)
# name = func
# name() # from func
# name1 = name
# name1() # from func
# 2.函数名还可以当作函数的实参
# def index(a):
# print(a) # <function func at 0x1046b8430>
# a()
# index(func) # from func
# 3.函数名还可以当作函数的返回值
# def index():
# return func
# res = index()
# res() # from func
# 4.函数名还可以当作容易类型里面的数据值
l1 =[1,2,3,4,func]
res = l1[-1]
res() # from func