我似乎无法弄清楚为什么我的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
答案 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
。你想从这个功能中得到什么?