6

私は試していたpython -mtimeitので、入れpython -mtimeit "n = 0; while n < 10: pass" ました 無効な構文エラーが表示されました。セミコロンと for ループと同じです。

ただし、セミコロンとループを個別に試すと。どちらもうまくいきました。

python -c "for i in range(10): print(n)"  
python -c "n = 1; n = 2; print(n)"

これはなぜですか。また、while ループを timeit でテストするにはどうすればよいですか? どうもありがとうございました!

4

5 に答える 5

11

whilefor前にセミコロンを付けることはできません。1 行にする必要があります。Python文法を見た場合:

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | funcdef
                   | classdef
                   | decorated
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

compound_stmtの一部であるステートメントは、 1 行だけにする必要があることがわかります。セミコロンで区切ることができる唯一のステートメントはsimple_stmtgroup:

simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | print_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | global_stmt
                 | exec_stmt
于 2013-09-03T22:34:32.257 に答える
1

スクリプトで記述している場合は、実際の python プログラムで行うのと同じようにインデントしてみませんか? このような:

python -mtimeit "
n = 0
while n < 10:
    pass"
于 2013-09-03T21:57:41.050 に答える
1

これは古いトピックですが、リスト内包表記について誰も言及していないので、ここにあります。

印刷が含まれる場合は、関数を使用したリスト内包表記も使用できます。

python2 -m timeit "from pprint import pprint; [pprint(i) for i in range(1000)]"

python2 とは異なり、すでに関数であるため、python3 では print 自体が機能します。

python3 -m timeit "[print(i) for i in range(1000)]"
于 2021-11-28T14:06:13.513 に答える