在Python中生成密码的程序中出现字符串索引超出范围错误

在Python中生成密码的程序中出现字符串索引超出范围错误,python,Python,我在大学里被分配了一个任务,写一个程序,用用户的名字和姓氏创建用户密码(例如:name='John',姓氏='Smith'=>密码将是'JSomhinth',但我犯了“indexer:字符串索引超出范围”的错误 name = input("Enter your name: ") surname = input("Enter your surname: ") print("Your credentials are %s %s." %(name, surname)) length = int((l

我在大学里被分配了一个任务,写一个程序,用用户的名字和姓氏创建用户密码(例如:name='John',姓氏='Smith'=>密码将是'JSomhinth',但我犯了“indexer:字符串索引超出范围”的错误

name = input("Enter your name: ")
surname = input("Enter your surname: ")
print("Your credentials are %s %s." %(name, surname))

length = int((len(name) + len(surname))/2)
password = []
x = 0
y = 0
if len(name)>len(surname):
    for i in range(0, length):
        for n in range(0, len(name)):
            password.append(name[x])
            x += 1
            break
        for m in range(0, len(surname)):
            password.append(surname[y])
            y += 1
            break
print(''.join(password))
您可以使用with
fillvalue
处理长度不等的情况

使用列表理解:

from itertools import zip_longest

name = 'John'
surname = 'Smith'

print(''.join([x + y for x, y in zip_longest(name, surname, fillvalue='')]))
# JSomhinth
或使用
映射

print(''.join(map(''.join, zip_longest(name, surname, fillvalue=''))))
# JSomhinth
问题在于:

if len(name)>len(surname):
    for i in range(0, length):
        for n in range(0, len(name)):
            password.append(name[x])
            x += 1
            break
        for m in range(0, len(surname)):
            password.append(surname[y])
            y += 1
            break
每次通过外部循环时,您都会在姓氏和递增
y
上点击内部循环。 因为姓氏比名字短,所以最终
y
将达到(len(name)+len(姓氏))/2-1,如果名字比姓氏长至少2个字符,这将使
姓氏[y]
调用抛出边界异常

在不相关的注释中,不需要内部循环,因为每次它们只运行一次,增加全局变量并中断,所以下面的代码也可以工作

if len(name)>len(surname):
    for i in range(0, length):
        password.append(name[x])
        x += 1
        if y < len(surname):
            password.append(surname[y])
        y += 1
如果len(姓名)>len(姓氏):
对于范围内的i(0,长度):
password.append(名称[x])
x+=1
如果y

奥斯汀的答案是解决这个问题最简洁的方法。

如果你使用
名字='John',姓氏='Smith'
,这个代码只打印全名,因为
len('John')
。如果我取name=Johnny,姓氏=Smith也可以。我得到了想要的密码,没有任何错误。我知道:D我没有到达elif部分,那里姓氏会更长。我想你应该只使用
length=min(len(name),len(姓氏))
Bazingaa,由于某些原因,此代码适用于某些名称,而不适用于其他名称。例如,对于Daniar Ivanov,这没关系,但是对于Daniar Smith,有一个错误无关的旁注:这些密码很糟糕,你不应该使用它们。你说,“因为姓氏比名字短,最终y将达到(len(name)+len len(姓氏))/2-1,如果名字比姓氏长至少2个字符,那么姓氏[y]调用将抛出越界异常。但我不明白为什么。我对python非常陌生,所以如果可能的话,请您尝试向我解释一下。兄弟,我终于明白为什么它是这样工作的了!非常感谢!还有调试器:D