Python自定义函数间传值方法及返回值调用AttributeError解决
报错核心原因
rec()函数执行后会返回用户名、密码两个值自动打包形成的元组,元组属于Python的序列类型,仅支持通过下标索引取元素,不存在usr、pwd这类自定义的可访问属性- 代码中
print(c.usr , c.pwd)的写法,是将c作为“带自定义属性的对象”取值,和rec函数实际的返回值结构完全不匹配,因此触发属性不存在的报错。若函数漏写return语句,拿到的返回值为None,也会触发同类NoneType无该属性的报错。
适配新手的正确实现方案
核心逻辑:函数间传值的本质是一个函数把return的内容,作为返回值传给调用它的函数,按照返回值的实际类型做对应取值即可,以下是两种可直接运行的带注释实现:
方案1:最简洁的元组解包(和原代码结构最贴近)
不需要额外的数据结构,直接利用Python原生的元组解包语法取返回值,适合纯新手快速上手:
# 定义rec函数:负责收集用户输入的账号信息 def rec(): # 捕获用户输入的用户名,存入局部变量usr usr = input('Enter Name : ') # 捕获用户输入的密码,存入局部变量pwd pwd = input('Enter Password : ') # return 多个值时,Python会自动将两个值打包为元组返回给调用方 return usr, pwd # 定义show函数:负责拿到rec采集的信息并输出 def show(): # 调用rec函数拿到返回的元组,直接解包为两个独立的变量usr_val、pwd_val # 等价于:c = rec() 之后 usr_val = c[0]、pwd_val = c[1] usr_val, pwd_val = rec() # 打印两个解包后的变量,完成展示 print(usr_val, pwd_val) # 程序执行入口:调用show函数触发完整流程 show()
方案2:匹配原代码点号取值的写法(用字典结构)
如果习惯用对象.字段名的逻辑取值,可以把返回值换成字典结构,用键值对存储账号信息,代码改动最小:
def rec(): usr = input('Enter Name : ') pwd = input('Enter Password : ') # 返回字典结构,把用户名、密码存在对应名称的键下 return { "usr": usr, "pwd": pwd } def show(): c = rec() # 字典通过方括号加键名,取到对应存储的内容 print(c["usr"], c["pwd"]) show()
说明:如果一定要实现
c.usr这种直接点号访问的语法,需要借助类封装自定义结构,对纯入门阶段的学习者来说,以上两种方案的学习成本更低,完全能满足函数间传值的练习需求。
内容的提问来源于stack exchange,提问作者Karan Verma
相关产品推荐
相关产品推荐

