Python循环调用自定义函数报错:'str'对象无'domain'属性,求修正
问题分析与修正方案
错误原因
你遇到的AttributeError核心问题是函数调用方式错误:
你写的i.domain(email, old_domain, new_domain)是把domain当成了字符串对象i的方法来调用,但domain是你自己定义的独立函数,并非Python字符串的内置方法。字符串类型根本没有名为domain的属性,所以会抛出这个错误。
另外原代码还有一个隐藏问题:email列表的定义缩进在了domain函数的return语句之后,属于函数内部代码,这行代码永远不会被执行,而且函数外的for循环无法访问到这个变量(不过从你的报错信息看,可能是粘贴代码时的缩进失误)。
修正后的代码
def domain(email, old_domain, new_domain): if "@" + old_domain in email: index = email.index("@" + old_domain) new_email = email[:index] + "@" + new_domain return new_email return email # 将email列表移到函数外部,确保for循环能访问到 email = ['sandeep@yahoo.com', 'maini@gmail.com', 'venky@yahoo.com', 'karupi@gmail.com'] old_domain = "yahoo.com" new_domain = "gmail.com" # 正确调用独立函数domain,把当前遍历的邮箱i作为第一个参数传入 for i in email: print(domain(i, old_domain, new_domain))
运行结果
执行修正后的代码会输出:
sandeep@gmail.com maini@gmail.com venky@gmail.com karupi@gmail.com
额外优化建议
如果你的邮箱格式都是标准的xxx@domain.com,可以用字符串的split方法简化domain函数的逻辑,代码更简洁易读:
def domain(email, old_domain, new_domain): local_part, domain_part = email.split("@", 1) if domain_part == old_domain: return f"{local_part}@{new_domain}" return email
内容的提问来源于stack exchange,提问作者Sandeep PC
相关产品推荐
相关产品推荐

