今日内容回顾7.4
*与**在实参中的作用
def func(*args, **kwargs):
print(args)
print(kwargs)
# func() # () {}
# func([1, 2, 3, 4, 5, 6]) # ([1, 2, 3, 4, 5, 6],) {}
# l1 = [1, 2, 3, 4, 5, 6]
# func(l1[0], l1[1], l1[2], l1[3], l1[4], l1[5]) # (1,2,3,4,5,6) {}
# func(*l1) # (1, 2, 3, 4, 5, 6) {}
'''func(1,2,3,4,5,6)'''
# s = 'hello'
# func(*s) # ('h', 'e', 'l', 'l', 'o') {}
'''func('h','e','l','l','o')'''
# d = {'1': 'jason', '2': 18}
# func(*d) # ('1', '2') {}
'''func('1','2')'''
# d1 = {'username': 'jason', 'pwd': 123}
# func(**d1) # () {'username': 'jason', 'pwd': 123}
# func(username='jason', pwd=123) # () {'username': 'jason', 'pwd': 123}
"""
*与**在形参中的作用
*与**在实参中的作用
"""
命名关键字参数(冷门了解)
# def func(a,b,*args):
# pass
# func(1,2)
# func(a=1,b=2)
# func(1,b=222)
'''需要形参在传实参的时候 必须按照关键字参数才可以'''
# 在形参*args的后面
# def func(a, b, *args, c):
# print(a, b, args, c)
# func(1,2,3,4,5,6,7) # 报错
# func(1, 2, 3, 4, 5, 6, c=666)
# 如果形参中还有**kwargs 那必须在它的前面
def func(a,b,*args,c,**kwargs):
pass
func(1,2,3,4,5,6,c=123,name='jason')
名称空间
就是用来存放变量名与数据值之间绑定关系的地方
"""
回忆
name = 'jason'
在内存中申请一块内存空间存储jason 然后绑定变量名name
变量名name与值jason的绑定关系就会被存储到名称空间中 之后使用名字都是去名称空间中查找并锁定对应的数据值
del name
删除的不是数据值 而是变量名以及变量名与数据值之间的绑定关系
"""
名称空间的分类
内置名称空间
python解释器运行就会立刻创建的空间
写代码过程中可以直接使用的名字都在该空间中
eg:len() print() input() ...
全局名称空间
py文件运行代码过程中产生的名字都会存入该空间
普通代码里面的变量名
分支结构里面的变量名
循环结构里面的变量名
定义函数的函数名
定义类的类名
局部名称空间
函数体代码运行过程中产生的名字都会存入该空间
名称空间的存活周期
内置名称空间
解释器运行(创建) 解释器关闭(销毁)
全局名称空间
py文件运行(创建) py文件结束(销毁)
局部名称空间
函数体代码运行(创建) 函数体代码结束(销毁)
名字的查找顺序
"""查找名字之前一定要先看自己在哪个名称空间"""
1.当前在全局名称空间
全局名称空间 >>>: 内置名称空间
2.当前在局部名称空间
局部名称空间 >>>: 全局名称空间 >>>: 内置名称空间
名字的查找顺序默认情况下不能颠倒只能是 局部>>>:全局>>>:内置
名称空间的作用域
1.内置名称空间
在程序任意位置都可以使用(全局有效)
2.全局名称空间
在程序任意位置都可以使用(全局有效)
3.局部名称空间
在各自的局部空间可以使用(局部有效)
局部名称空间复杂情况
1.各自局部名称空间默认情况下不能彼此共享名字
def func1():
name = 'jason'
print(age)
def func2():
age = 18
print(name)
func1()
func2()
2.特殊情况
# x = 1
#
#
# def func1():
# x = 2
# def func2():
# x = 3
# def func3():
# print(x) 特例
# # x = 4
# print(x)
# func3()
# func2()
# func1()
name = 'jason'
def func():
print(name)
name = 'jasonNB'
func()
函数在定义阶段其实名字的查找顺序就已经固定死了
global与nonlocal关键字
# money = 999
# def func():
# global money # 声明 局部名称空间中的money操作的是全局的money
# money = 1000
# print(money)
"""
正常情况下 局部名称空间里面出现新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字
"""
# func()
# print(money)
# l1 = [1, 2, 3, 4, 5]
# s = '$jason$'
# def func():
# global s
# s = 'jason'
# res = s.strip('$')
# l1.append(113123)
# l1.append(666)
# func()
# print(l1)
"""
局部修改全局名称空间中不可变类型的数据 需要使用关键字global声明
如果是可变类型 则无需关键字声明
"""
def func1():
x = 1
l1 = [1,2]
def func2():
# nonlocal x
x = 999
l1.append(666)
func2()
print(x)
print(l1)
func1()
"""
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)