2013-09-03 45 views
5

Tôi đã thử python -mtimeit vì vậy tôi đặt python -mtimeit "n = 0; while n < 10: pass" Sau đó, lỗi cú pháp không hợp lệ sẽ hiển thị. cùng với dấu chấm phẩy và cho vòng lặp.Đối số dòng lệnh dấu chấm phẩy lỗi lỗi

Tuy nhiên, khi tôi thử dấu chấm phẩy và lặp riêng lẻ. Cả hai đều làm việc tốt.

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

Tại sao lại như vậy và làm cách nào tôi có thể kiểm tra khi lặp trong thời gian? Cảm ơn nhiều!

+0

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

+0

Không cần phải xin lỗi! –

Trả lời

9

while, for không thể có dấu chấm phẩy trước đó, họ cần phải được trên cùng một dòng. Nếu bạn nhìn 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)* [";"] 

bạn sẽ thấy rằng các báo cáo là một phần của compound_stmt cần phải là một trong một dòng riêng. Các báo cáo duy nhất có thể được phân cách bằng dấu chấm phẩy là simple_stmt nhóm:

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

Nếu bạn đang viết nó trong một kịch bản, tại sao bạn không thụt lề nó chỉ là cách bạn sẽ làm điều đó trong một chương trình python thực? Như thế này:

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

timeit có thể nhận hai tham số: mã cài đặt và mã gian.

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

Ngoài ra, bạn nên thay đổi pass thành n += 1 hoặc bạn sẽ có vòng lặp vô hạn.

+0

'timeit' hoạt động [tốt] (http://docs.python.org/2/library/timeit.html#command-line-interface) với một đối số. Vấn đề là một trong những cú pháp. – Cairnarvon

+0

@Cairnarvon: Rõ ràng là nó không hoạt động tốt với một đối số mà OP đưa ra, trong khi nó làm việc với hai dạng đối số mà tôi đưa ra. Làm tốt lắm, bỏ phiếu cho câu trả lời duy nhất thực sự giải quyết được vấn đề. –

+0

Câu trả lời của bạn không giải quyết bất cứ điều gì, bởi vì nó bỏ lỡ điểm của câu hỏi. Vấn đề là * không * rằng 'timeit' có thể * tùy chọn * lấy nhiều hơn một đối số, hoặc thậm chí nghiêm chỉnh về' timeit' ngay từ đầu. Hai câu trả lời khác đưa ra một giải pháp thích hợp và giải thích về vấn đề thực tế. – Cairnarvon

0

Câu trả lời được lựa chọn tuyệt vời đã khắc phục những lý do tại sao, nhưng không phải là câu hỏi về cách thức này có thể được làm việc xung quanh dưới bất kỳ hệ điều hành (kể từ cửa sổ cmd không cho phép báo cáo đa dòng)

Câu trả lời là: exec

Bạn phải lồng vòng bất kỳ trong câu lệnh exec.

Ví dụ: (Python 2)

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

là một lỗi cú pháp, trong khi

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

tác phẩm một cách chính xác.

Các vấn đề liên quan