我的if语句出了什么问题?蟒蛇

时间:2017-05-04 01:12:47

标签: python if-statement indexing

我似乎无法弄清楚为什么我的if语句不起作用。我是编程的新手,我正在尝试创建一个刽子手游戏来测试我的工作方式。我设置它,以便代码将选择一个随机单词,计算该单词的字母,放置破折号以显示每个字母的位置。在这一点上,我正在尝试使用if语句来索引每个字母,直到它完成所有字母。这是代码。

"""
python simple.py
"""

from random_words import RandomWords
rw = RandomWords()
word = rw.random_word()
print(word)

word_len = len(word)
print(("___" + "   ") * word_len)
def letters(word):
    if word_len >= 0:
        letter1 = word[0]
    else:
        pass
    if word_len >= 1:
        letter2 = word[1]
    else:
        pass
    if word_len >= 2:
        letter3 = word[2]
    else:
        pass
    if word_len >= 3:
        letter4 = word[3]
    else:
        pass
    if word_len >= 4:
        letter5 = word[4]
    else:
        pass
    if word_len >= 5:
        letter6 = word[5]
    else:
        pass
    if word_len >= 6:
        letter7 = word[6]
    else:
        pass
    if word_len >= 7:
        letter8 = word[7]
    else:

print(letters(word))

我得到的错误如下:

Traceback (most recent call last):
  File "simple.py", line 46, in <module>
    print(letters(word))
  File "simple.py", line 30, in letters
    letter5 = word[4]
IndexError: string index out of range

4 个答案:

答案 0 :(得分:1)

Python是0索引的,因此长度为4的word只有word[0]word[3]

尝试访问word[4]会使您的索引超出范围错误。

请注意您的第一个条件

if word_len >= 0:
        letter1 = word[0]

即使word[0]的长度为零,也会尝试访问word

答案 1 :(得分:1)

说这个词是“猫”。 len(word)将返回4,但您只能将字符串从0到3编入索引。将&gt; =符号更改为&gt;。

除此之外,你可以在任何地方消除else - pass语句。如果if语句不为true,它将自动传递到下一行。

答案 2 :(得分:0)

抛开如何使用if / else的问题,您可以使用简单的列表()轻松替换整个if / else链。尝试下面的代码,它演示了这个:

a = "abcd"
print(list(a))

一种编码风格的东西,尽量不要使用像letter1,letter2这样的变量,任何时候你都会想到它们,试着想一下它们是否可以被列表等的集合所取代。

答案 3 :(得分:0)

很多东西。

您拥有的不是if声明。这是八个单独的if语句。代码运行时,它会计算第一个if语句。然后,无论它在第一个语句中做了什么,它都会评估第二个,然后是第三个,等等。

您真正想要使用的是elif语句。这会将您的代码转换为一个语句,并且只有在前面的elif语句之一未评估为if/elif时才会评估后续True语句。

最重要的是,Python使用基于零的索引。因此,如果您的单词是“foo”,那么您将拥有len(word) == 3。但索引意味着word[0] == 'f'word[1] == 'o'word[2] == 'o'。没有word[3]

所以,代码运行时

if word_len >= 4:
    letter5 = word[4]

你的单词长度为4,所以没有word[4],但你仍然试图引用它。

最后,您的功能实际上并不是return。你想从这个功能中得到什么?