0

文中の単語の平均長を求める関数を定義しようとしています。すべて問題ありませんが、私の機能の特定の部分、つまりこれについて質問があります。

random_sentence = str(input('Enter a sentence:'))

def average():
    'Takes the average length of a word in a sentence inputed by user.'
    words = random_sentence.split()
    averageword = sum(len(word) for word in words)/len(words)
    return averageword

print(average())

averageword = sum(len(word) for word in words)/len(words)

私は sum と len が何をするかを理解していますが、Python はどのようにして「単語」が「for word in words」にあるのかを知っています。どこかに事前定義されていますか?そのフレーズを機能作業から取り出すと、単語が定義されていないと表示されます。明確にしていただきありがとうございます。

4

4 に答える 4

4

for は Python のキーワードです

Python がプログラムを実行すると、ファイルは字句解析によって一連のトークンに変換されます。その後、トークンがどの構造に属しているかを判断するために、トークンが解析されます。

あなたの場合、 の前のトークンforは、構成をジェネレーター式にします。

于 2013-02-10T18:35:56.303 に答える
2

リストは反復可能です。リストの反復子を返すメソッドをwords定義します。キーワードは__iter__リストを呼び出し、例外がスローされるまで反復子を呼び出します。for__iter__()next()StopIteration

In [1]: words = ["a", "b"]

In [2]: i = words.__iter__()

In [3]: i
Out[3]: <listiterator at 0x5cd82b0>

In [4]: i.next()
Out[4]: 'a'

In [5]: i.next()
Out[5]: 'b'

In [6]: i.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-6-e590fe0d22f8> in <module>()
----> 1 i.next()

StopIteration:

イテラブルとイテレータに関する詳細:

http://docs.python.org/2/library/stdtypes.html#iterator-types http://getpython3.com/diveintopython3/iterators.html#a-fibonacci-iterator

于 2013-02-10T18:43:34.053 に答える
0

「単語」は、リスト内包表記とジェネレーター式、および for ループでローカルに定義されます。一時変数のようなものです。

「単語」を「x」に置き換えて、次のように考えてください。

theSum = sum([len(x) for x in words]) 

(リストのようなものであることを示すために括弧で囲みます)。これは、「x をリスト 'words' の要素とする。すべての x について、その長さを計算し、結果からリストを作成する」ことを意味します。

次のように考えることもできます。

list = []
for x in words:
    list.append(len(x))

theSum = sum(list)

List Comprehensionsで構文の詳細を取得できます

于 2013-02-10T19:03:43.113 に答える
0

for x in y では、y がイテラブル (つまり、リスト、辞書、文字列など) である必要があります。

そして、python は y を反復し、各反復 x は y[反復#] として定義されます

基本的にy = [1,2,3]の場合

for x in y:
    print x

戻ります

1

2

3

于 2013-02-10T18:37:27.590 に答える