如何用*args、**kwargs直接存储输入及生成学生信息字典?
问题解答
一、不用列表,用*args实现姓名输入与打印
先修正你原代码里的几个问题:
- Python关键字要小写:
Def改成def,While改成while - 函数参数
*args和内部变量Args重名,且input()默认按回车返回一行内容,split('\n')完全没必要 - 停止判断逻辑错误,你拿函数参数
args和字符串比较,应该判断每次输入的内容
方案1:用元组收集后返回(无显式列表)
def test1(): names = [] while True: name = input("enter st name: ") if name == "stop": break names.append(name) # 返回元组,*args可直接接收 return tuple(names) def test2(*args): for i in args: print(i) test2(*test1())
方案2:用生成器彻底避免显式容器
如果不想提前存所有输入,用生成器函数更省内存,调用时直接解包给*args:
def test1(): while True: name = input("enter st name: ") if name == "stop": break yield name def test2(*args): for i in args: print(i) test2(*test1())
二、获取姓名+成绩生成字典,用**kwargs实现
可以让用户输入姓名:成绩格式的内容,拆分后直接生成字典,再通过**kwargs传递给处理函数:
方案1:生成器转字典
def get_student_scores(): while True: info = input("enter name:score (type 'stop' to end): ") if info == "stop": break name, score = info.split(":") yield name, int(score) # 直接生成字典 student_dict = dict(get_student_scores()) print(student_dict) # 用**kwargs传递给处理函数 def print_student_info(**kwargs): for name, score in kwargs.items(): print(f"{name}: {score}") print_student_info(**student_dict)
方案2:直接收集为字典返回
def get_student_scores(): scores = {} while True: info = input("enter name:score (type 'stop' to end): ") if info == "stop": break name, score = info.split(":") scores[name] = int(score) return scores def print_student_info(**kwargs): for name, score in kwargs.items(): print(f"{name}: {score}") print_student_info(**get_student_scores())
关于input().split()的问题
input()本身就是读取一行输入(按回车结束),split()是把同一行内的内容按空格拆分。如果你要按回车逐个输入,每次循环单独调用一次input()就行,完全不需要加split('\n')——这个操作对单行输入毫无意义。
内容的提问来源于stack exchange,提问作者elahe motavalian
相关产品推荐
相关产品推荐

