添加else子句后Python函数循环匹配成功仍返回原登录名的原因?
问题分析:添加else子句后函数匹配失效的原因
先看你的代码问题:
users = [ (['bmiller', 'Miller, Brett'], 'Brett Miller'), (['Gianni Tina', 'tgiann', 'tgianni'], 'Tina Gianni'), (['mplavis', 'marcusp', 'Plavis, Marcus'], 'Marcus Plavis') ] def replace_user_login_with_name(login): name = '' for u in users: if login in u[0]: name = str(login).replace(login, u[1]) else: # without these lines name = str(login) # it works fine return name
为什么加了else就失效?
核心是循环会遍历所有用户项,else分支会覆盖之前的正确赋值:
- 当传入
bmiller时,第一次循环匹配到第一个用户,name被设为Brett Miller - 但循环不会停止,会继续遍历第二个、第三个用户
- 后面的用户项里没有
bmiller,每次都会触发else分支,把name重新改成原登录名bmiller - 循环结束后,返回的就是最后一次赋值的结果,也就是原登录名
而之前没加else的时候,后面的循环不匹配时不会修改name,所以最后返回的还是第一次匹配到的正确全名。
两种修复方案
方案1:找到匹配就立即返回(最高效)
一旦找到对应的用户,直接返回全名,不用再遍历后续项:
users = [ (['bmiller', 'Miller, Brett'], 'Brett Miller'), (['Gianni Tina', 'tgiann', 'tgianni'], 'Tina Gianni'), (['mplavis', 'marcusp', 'Plavis, Marcus'], 'Marcus Plavis') ] def replace_user_login_with_name(login): for u in users: if login in u[0]: return u[1] # 遍历完所有用户都没匹配到,返回原登录名 return login
方案2:先默认返回原登录名,找到匹配再更新
先把name初始化为原登录名,只有找到匹配时才修改,还可以提前终止循环提升效率:
users = [ (['bmiller', 'Miller, Brett'], 'Brett Miller'), (['Gianni Tina', 'tgiann', 'tgianni'], 'Tina Gianni'), (['mplavis', 'marcusp', 'Plavis, Marcus'], 'Marcus Plavis') ] def replace_user_login_with_name(login): name = login for u in users: if login in u[0]: name = u[1] break # 找到后直接退出循环,避免无用遍历 return name
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

