2

この質問は私の教育に関連しています。それは、あなたが私にできる限り詳細な情報を提供してくれることを望んでいるということです-コードをコピーして貼り付けて渡したくありません.:)

タスクは簡単です。writeshort(txt) という定義を作成し、単語の文字列を取得して、5 文字未満の単語のみを出力します。今、私はこれを完了しましたが、問題はタスクが具体的に use a definitionと言うことです。ここで失敗します。

動作する定義のないコード:

#!/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!”

これで見栄えが良くなり、厄介な [' '] なしで印刷されます。しかし、定義はどうですか?私はいくつかのことを試しましたが、これが最新ですが、5文字未満の最初の単語のみを出力し、残りは無視します:

#!/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

はい、writeshort短い単語を見つけたときにループインが 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:は奇妙なことを書いています。意図したとおりに実行されますが (元の各アイテムに対して実行されますtxt)、txt反復ごとにリストのアイテムに変更されます。

于 2012-10-05T18:05:40.550 に答える
1

あなたの問題はreturn txt; ループ中に、forPython が最初にそのステートメントにヒットすると、戻りtxt呼び出しをwriteshort完全に停止します。

それらをリストに収集してから使用する古いコードのようにしないのはなぜですか?

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

(紛らわしいfor txt in txtものをに変更しましたfor 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) ここでの主な問題は、5 文字より短い単語を見つけるとすぐに関数から戻ることです。これらの単語のリストを保存し、txt 内のすべての単語をチェックした後にリスト全体を返すことを検討する必要があります。

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