2

这个问题与我的教育有关,也就是说我希望您能尽可能详细地为我提供任何帮助-我不想复制粘贴代码并将其交给。:)

任务很简单 - 创建一个名为 writeshort(txt) 的定义,获取一串单词,只打印少于五个字符的单词。现在我已经完成了这个,但问题是该任务专门使用了一个定义。我在这里失败了。

没有定义的代码,有效:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

string = raw_input(”Write a few lines: ”)
txt = string.split()
result = []

for words in txt:
    if len(words) > 4:
        continue
    result.append(words)

print ', '.join(result), ”have less than five letters!”

现在看起来不错,并且打印时没有任何讨厌的 [' ']。但是定义呢?我已经尝试了几件事,这是最新的,但它只打印少于五个字母的第一个单词,而忽略其余的:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

string = raw_input(”Write a few lines: ”)
txt = string.split()

def writeshort(txt):
    for txt in txt:
        if len(txt) > 4: #Yes I know its a 4, but since it counts 0...
            continue
        return txt

print writeshort(txt), "have fewer letters than five!"

我很感激任何帮助。感谢您花时间帮助我学习 Python!

4

3 回答 3

7

是的,因为循环inwriteshort遇到了return语句,找到了一个短单词,立即返回。

如果您需要来自 的所有短词writeshort,您需要先将它们收集到一个列表中,然后最后返回该列表。也许是这样的:

def writeshort(txt):
    wordlist = []
    for item in txt:
        if len(item) > 4:
            continue
        wordlist += [item] # or wordlist.append(item) as in your first snippet
    return wordlist

整个函数可以用一个单行和更多的pythonic代码代替:

[word for word in txt if len(word) <= 4]

你已经写for txt in txt:了,这很奇怪。它将执行预期的操作(对 original 中的每个项目执行txt),但txt会在每次迭代中更改为列表中的一个项目。

于 2012-10-05T18:05:40.550 回答
1

你的问题是return txt; 在for循环期间,Python 第一次命中该语句时,它将返回txt完全停止调用writeshort.

为什么不像您的旧代码那样将它们收集到一个列表中然后使用它呢?

def writeshort(txt):
    result = []
    for word in txt:
        if len(word) > 4:
            continue
        result.append(word)
    return result

(我将混淆更改for txt in txtfor word in txt,它不会覆盖名为 的旧变量txt。)

另外,您对的评论if len(word) > 4让我认为您可能对此有些困惑:len不“计数 0”-您可能正在考虑索引,它从 0 开始。您需要的原因> 4是因为它检查它是否大于4,即5个或更多。你也可以说>= 5


当我们这样做的时候,为什么不让你的代码更好一点呢?

除了continue在你的循环中使用,你可以通过否定条件更直接地做到这一点:

result = []
for word in txt:
    if len(word) < 5:
        result.append(word)

顺便说一句,这种将事物收集到列表中的模式实际上非常普遍,以至于 Python 有一种特殊的语法来处理它(以及一些更一般的情况),称为列表推导:

def writeshort(txt):
    return [word for word in txt if len(word) < 5]
于 2012-10-05T18:05:50.970 回答
0

几个想法:

1)您将 txt 用作循环的集合和当前元素:

for txt in txt:

这在最好的情况下会令人困惑。尝试

for word in txt:

2)这里的主要问题是,一旦发现一个短于五个字符的单词,您就会从函数中返回。您应该查看保存这些单词的列表,然后在检查 txt 中的每个单词后返回整个列表。

def writeshort(txt):
    shortwords = []
    for word in txt:
        if len(txt) > 4: 
            continue
        shortwords += [word]
    return shortwords
于 2012-10-05T18:12:27.193 回答