Python command line argument semicolon-loop error

白昼怎懂夜的黑 提交于 2019-11-27 06:59:35

问题


I was trying out python -mtimeitso I put python -mtimeit "n = 0; while n < 10: pass" Then an invalid syntax error showed up. same with semicolon and for loop.

However, when I try semicolon and loop individually. Both worked fine.

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

Why is this so and how can I test while loop in timeit? Thank you very much!


回答1:


while, for can't have semicolon before, they need to be on one line. If you looked at Python grammar:

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)* [";"]

you will see that the statements that are part of compound_stmt need to be one one line alone. The only statements that can be separated by semicolon are simple_stmt group:

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



回答2:


timeit can take two parameters: the setup code and the code to time.

python -mtimeit "n = 0" "while n < 10: pass"

Also, you should change that pass to n += 1 or you'll be in an infinite loop.




回答3:


If you're writing it in a script, why don't you indent it just the way you would do it in a real python program? Like this:

python -mtimeit "
n = 0
while n < 10:
    pass"



回答4:


The selected answer superbly tackles the why, but not the question of how this can be worked around under any operating system (since windows cmd doesn't allow multi-line statements)

The answer is: exec

You have to nest any loops in an exec statement.

Examples: (Python 2)

python -c "i = 3; while i:print i; i-=1"

is a syntax error, while

python -c "i = 3; exec 'while i:print i;i-=1'"

works correctly.



来源:https://stackoverflow.com/questions/18602119/python-command-line-argument-semicolon-loop-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!