1

次のPythonの動作に遭遇しただけで、頭を悩ませることはできません。

names = ["Paul", "Mary", "Susan"]
names.sort()

def valuate(string):
    print ord('A')
    return sum(ord(s) for s in string)

i = 1
for name in names:
    print i, name, valuate(name)
    i += 1

私が出力することを期待するもの:

65
1 Mary 409
65
2 Paul 402
65
3 Susan 522

しかし、代わりに出力:

1 Mary 65
409
2 Paul 65
402
3 Susan 65
522

printステートメントはすでに3つの要素を出力しようとしているようですが、print ord('A')が呼び出されると、これが3番目のステートメントになりますか?

私はこの振る舞いへの言及を見つけられず、これをグーグルで検索する方法がわかりません。ちなみに、ここではPython2.7.3を使用しています。とにかく、私はここで混乱しています。

4

5 に答える 5

6

それは単なるprintステートメントではなく、関数呼び出しです。

print i, name, valuate(name)

Prints i、then name、then呼び出しは、valuate65(および新しい行)を出力し、return時に、printステートメントは戻り値(および別の改行)を出力し続けます。

于 2012-12-09T21:41:43.920 に答える
4

イベントのシーケンスは次のとおりです。

print i,
print name,
val = valuate(name) # prints ord('A')
print val

これは、以下のために生成されたバイトコードを調べることによって確認されprint i, name, valuate(name)ます。

 11          19 LOAD_FAST                0 (i)
             22 PRINT_ITEM          
             23 LOAD_FAST                1 (name)
             26 PRINT_ITEM          
             27 LOAD_GLOBAL              1 (valuate)
             30 LOAD_FAST                1 (name)
             33 CALL_FUNCTION            1
             36 PRINT_ITEM          
             37 PRINT_NEWLINE       

この評価順序が保証されているかどうかはわかりません(クイック検索では何も見つかりませんでした)。私は間違いなくそれに依存しないので、このようなコードを書くことはありません。

于 2012-12-09T21:42:39.400 に答える
3

とても簡単です。あなたのprintステートメントは引数を怠惰に評価します。最初にiを出力し、次に名前を出力してから、valuateを呼び出します。Valuateは65を出力します。次に、printステートメントはvaluateの結果を出力します。

于 2012-12-09T21:41:45.947 に答える
2

あなたが遭遇している驚きは、printステートメントが次の式を評価する前に与えられた各式を出力することです。つまり、次のようなステートメントは次のようprint A, B, Cになります。

print A, # note, the trailing comma suppresses the newline
print B,
print C

別のステートメントから予想されるように、AはBまたはCが評価される前に書き出されます。

この驚きは、Python 3がprintステートメントを廃止し、print期待どおりに動作する組み込み関数を採用した理由の一部である可能性があります(関数が実行される前にすべての引数が評価されます)。

Python 2では、インポートprintを使用する場合はPython3スタイルを取得できます。future

from __future__ import print_function
于 2012-12-09T21:53:26.257 に答える
0

小さな「、」は物事をより簡単に把握できるようになると思います。

names = ["Paul", "Mary", "Susan"]
names.sort()

def valuate(string):
    print ord('A'),
    return sum(ord(s) for s in string)

i = 1
for name in names:
    print i, name, valuate(name)
    i += 1

これで、次のように出力されます。

1 Mary 65 409
2 Paul 65 402
3 Susan 65 522

後のコンマprintは、末尾に改行文字を出力しないようにします。これで、valuate最初にを印刷してord('A')から、外側の印刷の出力を返すことがわかります。(行もインデントしましたi += 1

于 2012-12-09T21:47:26.177 に答える