具有枚举和for循环的代码给我的第一个字母重复的结果

时间:2019-01-14 03:44:21

标签: python python-3.x

有人可以帮助我理解为什么此代码两次返回第一个字母吗?目的是将字符串的第一个和第四个字母大写。

def old_macdonald(name):
    newname=''
    for i,letter in enumerate(name):
        if i==0:
            newname+=letter.upper()
        if i==3:
            newname+=letter.upper()
        else:
            newname+=letter
    return newname

old_macdonald('Macdonald')

输出:

MMacDonald  # when it should be MacDonald instead of MM

3 个答案:

答案 0 :(得分:3)

第二条if语句应为elif

def old_macdonald(name):
    newname=''
    for i,letter in enumerate(name):
        if i==0:
            newname+=letter.upper()
        elif i==3:
            newname+=letter.upper()
        else:
            newname+=letter
    return newname

old_macdonald('Macdonald') # 'MacDonald'

在您的代码中,在第一个字母上,第一个if语句运行,追加一个字母,移至第二个if语句,失败,移至else语句,然后追加另一个字母,从而复制第一个字母。将第二个if更改为elif,可以确保仅执行三个块之一。

答案 1 :(得分:2)

正如Tomothy所提到的那样,问题在于将python中if ... else语句的条件及其解释方式进行堆叠。

   if i==0:                       
        newname+=letter.upper()     #When i is 0 newname wil be changed to `M`
   if i==3:                        # Here i is still 0 but the condition fails
        newname+=letter.upper()
   else:                           # This is an else statement after a filed if, so it will be executed
        newname+=letter             # Here i is still 0 and this part executes and causes duplication

elif可以解决您的问题,告诉python您希望将ifelifelse当作一个单独的逻辑单元进行评估。

答案 2 :(得分:0)

或使用:

def old_macdonald(name):
   newname=''
   for i,letter in enumerate(name):
       if i==0:
           newname+=letter.upper()
       if i==3:
           newname+=letter.upper()
       if i not in [0,3]:
           newname+=letter

   return newname
print(old_macdonald('Macdonald'))

输出:

MacDonald