以艰难的方式学习Python,练习25,没有得到预期的结果

时间:2014-04-03 15:08:23

标签: python

我正在练习艰难学习Python的练习25,但我没有得到预期的结果。当我在参数字(列表)上调用print_first_word时,我输入shell:

  

ex25.print_first_word(字)

我被告知我应该看到:

  

所有

相反,我看到了

  

的等待。

值得一提的是:

  

['所有','好','事情','来','到',& #39;那些','等等。']

这是我的代码:

def break_words(stuff):
    """This Function will break up words for us."""
    words = stuff.split(' ')
    return words

def sort_words(words):
    """Sorts the words."""
    return sorted(words)

def print_first_word(words):
    """Prints the first word after popping it off."""
    word = words.pop(0)
    print word

def print_last_word(words):
    """Prints the last word after popping it off."""
    word = words.pop(-1)
    print word

def sort_sentence(sentence):
    """Takes in a full sentence and returns the sorted words."""
    words = break_words(sentence)
    return sort_words(words)

def print_first_and_last(sentence):
    """Prints the first and last words of the sentence"""
    words = break_words(sentence)
    print_first_word(words)
    print_last_word(words)

def print_first_and_last_sorted(sentence):
    """Sorts the words then prints the first and last one."""
    words = sort_sentence(sentence)
    print_first_word(words)
    print_last_word(words)

4 个答案:

答案 0 :(得分:1)

我的猜测是你在IDLE(或其他交互式shell)中执行此操作并且之前的测试运行"影响了你的输入。首先尝试print words,看看它是否符合您的预期。你的代码看起来是正确的。

请记住,list.pop(正如您在函数中print_first_word(words)实际上从列表中删除了其目标。也就是说:

words = ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']
words.pop(0) # returns 'All', but since I don't assign it anywhere, who cares
print(words)
# ['good', 'things', 'come', 'to', 'those', 'who', 'wait.']

如果您没有尝试从列表中删除元素,请不要pop,只需将其剪切即可。

words = ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']
words[0] # ALSO returns 'All', though again I'm not doing anything with it
print(words)
# ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']

答案 1 :(得分:1)

你应该记住两件事。首先,pop()方法修改它所使用的列表;一旦您使用pop()访问项目,它就不再在列表中。看看这一系列命令:

>>> words = ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']
>>> words.pop(0)
'All'
>>> words.pop(0)
'good'
>>> words.pop(0)
'things'
>>> words.pop(0)
'come'
>>> words.pop(0)
'to'
>>> words.pop(0)
'those'
>>> words.pop(0)
'who'
>>> words.pop(0)
'wait.'

>>> words.pop(0)

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    words.pop(0)
IndexError: pop from empty list
>>> 

其次,这非常令人困惑,列表是通过引用传递的。这意味着当您致电print_first_word(words)时,words.pop(0)不仅会修改您函数中的局部变量。它会修改您的原始列表!因此,如果您多次拨打print_first_word(words),其输出每次都会有所不同,类似于您在上面看到的内容。

您可以使用word = words[0]解决此问题,word = words.pop(0)仅检索0的值,而不是{{1}}。

答案 2 :(得分:1)

正如我所说,我没有改变你的代码中的单个字符,它运行得非常好。这就是我所拥有的

    def print_first_word(words):
    """Prints the first word after popping it off."""
    word = words.pop(0)
    print word

    words=['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait.']

    print_first_word(words)

结果是All

答案 3 :(得分:0)

问题是我没有导入我认为的文件。在Learn Python The Hard Way, Exercise 25, module has no attribute 'print_last_word'对我的问题发表评论的人建议我

print ex25.__file__

这向我展示了我实际导入的文件。然后,我确保从正确的路径导入。

请告诉我这是否更好地发布为我的问题的更新/编辑。谢谢!