python学习笔记
今日内容概要
- *与**在实参中的作用
- 命名关键字参数(冷门了解)
- 名称空间
- 作用域
- global与nonlocal关键字
- 函数名的多种使用方式
今日内容详细
*与**在实参中的作用
*在形参中的作用
接收多余的位置参数并组织成元组的形式赋值给*后面的变量名
**在形参中的作用
接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名
*在实参中作用
把*后面的值拆分成实参
def func(*args, **kwargs):
print(args)
print(kwargs)
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')'''
**在实参中的作用
** 后跟的是字典,把**后面的值拆分成成关键字实参
def func(*args, **kwargs):
print(args)
print(kwargs)
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) # 1 2 (3, 4, 5, 6) 666
# 如果形参中还有**kwargs 那必须在它的前面
def func(a, b, *args, c, **kwargs):
print(a, b, args, c, kwargs)
func(1, 2, 3, 4, 5, 6, c=123, name='jason') # 1 2 (3, 4, 5, 6) 123 {'name': 'jason'}
名称空间与作用域
名称空间 | 存放的名字 | 存活周期 | 作用域 |
---|---|---|---|
内置名称空间 | py解释器内内置的名字 | 解释器运行(创建) 解释器关闭(销毁) | 在程序任意位置都可以使用(全局有效) |
全局名称空间 | py文件运行代码过程中产生的名字 | py文件运行(创建) py文件结束(销毁) | 在程序任意位置都可以使用(全局有效) |
局部名称空间 | 函数体代码运行过程中产生的名字 | 函数体代码运行(创建) 函数体代码结束(销毁) | 在各自的局部空间可以使用(局部有效) |
名称空间就是用来存放变量名与数据值之间绑定关系的地方
回忆:
name = 'jason'
在内存中申请一块内存空间存储jason,然后绑定变量名name
变量名name与值jason的绑定关系就会被存储到名称空间中,之后使用名字都是去名称空间中查找并锁定对应的数据值
del name
删除的不是数据值而是变量名以及变量名与数据值之间的绑定关系
名字的查找顺序
提示:查找名字之前一定要先看自己在哪个名称空间
1.当前在全局名称空间
全局名称空间 >>>: 内置名称空间
2.当前在局部名称空间
局部名称空间 >>>: 全局名称空间 >>>: 内置名称空间
名字的查找顺序默认情况下不能颠倒只能是 局部>>>:全局>>>:内置
局部名称空间复杂情况
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) # 1000
func()
print(money) # 1000
l1 = [1, 2, 3, 4, 5]
s = '$jason$'
def func():
global s
res = s.strip('$')
s = res
l1.append(113123)
l1.append(666)
func()
print(l1) # [1, 2, 3, 4, 5, 113123, 666]
print(s) # jason
正常情况下 局部名称空间里面出现新的名字会在局部名称空间中存储
但是有时候需要在局部名称空间中修改全局名称空间的名字
局部修改全局名称空间中不可变类型的数据 需要使用关键字global声明
如果是可变类型 则无需关键字声明
def func1():
x = 1
l1 = [1,2]
def func2():
nonlocal x
x = 999
l1.append(666)
func2()
print(x) # 999
print(l1) # [1, 2, 666]
func1()
nonlocal 在内存局部名称空间修改外层局部名称空间中的不可变类型
函数名的多种使用方法
1.函数名也可以被用来多次赋值(函数名与变量名使用一致)
def func():
print('from func')
name = func
name()
name1 = name
name1()
2.函数名还可以当做函数的实参
def func():
print('from func')
def index(a):
print(a)
a()
index(func) # from func
3.函数名还可以当做函数的返回值
def func():
print('from func')
def index():
return func
res = index()
print(res)
res() # from func
4.函数名还可以当做容器类型里面的数据值
def func():
print('from func')
l1 = [1,2,3,4,func]
print(l1)
l1[-1]() # from func
构造功能模板
def register():
print('注册功能')
def login():
print('登录功能')
def check_account():
print('查看账户余额')
def withdraw():
print('体现功能')
def shopping():
print('购物功能')
def transfer():
print('转账功能')
# 提前构造功能字典
func_dict = {'1': register,
'2': login,
'3': check_account,
'4': withdraw,
'5': shopping,
'6': transfer
}
while True:
print("""
1.注册功能
2.登录功能
3.查看余额
4.提现功能
5.购物功能
6.转账功能
""")
choice = input('>>>:').strip()
if choice in func_dict:
func_name = func_dict.get(choice)
func_name()
else:
print('没有该功能编号')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了