2013-09-03 4 views
5

Ich habe versucht, python -mtimeit, so dass ich Dann einen ungültigen Syntaxfehler angezeigt. Gleiches mit Semikolon und for-Schleife.Python Kommandozeilenargument Semikolon-Schleife Fehler

Allerdings, wenn ich Semikolon und Schleife einzeln versuchen. Beides funktionierte gut.

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

Warum ist das so und wie kann ich testen, während in timeit Schleife? Vielen Dank!

+0

'python -mtimeit -c" n = 1; n = 2; drucken (n) "'? –

+0

Keine Notwendigkeit, so entschuldigend zu sein! –

Antwort

9

while, for nicht vor dem Semikolon haben, müssen sie auf einer Linie sein. Wenn man sich Python grammar sah:

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

werden Sie sehen, dass die Aussagen, die Teil compound_stmt sind, müssen allein um eine Zeile sein. Die einzigen Anweisungen, die durch ein Semikolon getrennt werden können, sind simple_stmt Gruppe:

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 
1

Wenn Sie es in einem Skript schreiben, warum sollten Sie es nicht so einrücken, wie Sie es in einem echten Python-Programm tun würden? Wie folgt aus:

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

timeit zwei Parameter annehmen kann: die Setup-Code und den Code zu Zeit.

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

Außerdem sollten Sie, dass pass zu n += 1 ändern, oder Sie werden in einer Endlosschleife sein.

+0

'timeit' funktioniert [gut] (http://docs.python.org/2/library/timeit.html#command-line-interface) mit einem Argument. Das Problem besteht in der Syntax. – Cairnarvon

+0

@Cairnarvon: Es funktioniert offensichtlich nicht gut mit dem einen Argument, das das OP gab, während es mit der zwei Argumentform funktioniert, die ich gab. Gute Arbeit, die einzige Antwort, die das Problem tatsächlich gelöst hat. –

+0

Ihre Antwort löst nichts, weil sie den Punkt der Frage verfehlt. Das Problem ist * nicht * dass 'Zeit' kann * optional * mehr als ein Argument, oder sogar streng genommen nur um 'Zeit' an erster Stelle. Die anderen zwei Antworten geben eine richtige Lösung und eine Erklärung des tatsächlichen Problems. – Cairnarvon

0

Die gewählte Antwort hervorragend greift das warum, aber nicht die Frage, wie dies kann um unter jedem Betriebssystem gearbeitet werden (da Fenster cmd erlaubt keine mehrzeiligen Anweisungen)

Die Antwort lautet: exec

Sie müssen alle Schleifen in einer exec-Anweisung verschachteln.

Beispiele: (Python 2)

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

ist ein Syntaxfehler, während

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

korrekt funktioniert.