Python không đảm bảo việc sử dụng dấu chấm phẩy để kết thúc câu lệnh. Vậy tại sao điều này (dưới đây) được cho phép?
import pdb; pdb.set_trace()
Python không đảm bảo việc sử dụng dấu chấm phẩy để kết thúc câu lệnh. Vậy tại sao điều này (dưới đây) được cho phép?
import pdb; pdb.set_trace()
Câu trả lời:
Python không yêu cầu dấu chấm phẩy để chấm dứt các câu lệnh. Semi colons có thể được sử dụng để phân định các câu lệnh nếu bạn muốn đặt nhiều câu lệnh trên cùng một dòng.
Bây giờ, tại sao điều này được cho phép? Đó là một quyết định thiết kế đơn giản. Tôi không nghĩ Python cần thứ nửa dấu hai chấm này, nhưng ai đó nghĩ rằng nó sẽ rất hay nếu có nó và thêm nó vào ngôn ngữ.
timeit a = 5; a*a
timeit
nghĩa là gì? a = 2; a*a
là vô dụng vì a
vẫn là 2; nó sẽ phải làa = 2; a *= a
http://docs.python.org/reference/compound_stmts.html
Báo cáo hợp chất bao gồm một hoặc nhiều 'mệnh đề'. Một mệnh đề bao gồm một tiêu đề và một 'bộ.' Các tiêu đề mệnh đề của một câu lệnh ghép cụ thể đều ở cùng một mức thụt đầu dòng. Mỗi tiêu đề mệnh đề bắt đầu bằng một từ khóa xác định duy nhất và kết thúc bằng dấu hai chấm. Một bộ là một nhóm các câu lệnh được kiểm soát bởi một điều khoản. Một bộ có thể là một hoặc nhiều câu lệnh đơn giản được phân tách bằng dấu chấm phẩy trên cùng một dòng với tiêu đề, theo dấu hai chấm của tiêu đề hoặc nó có thể là một hoặc nhiều câu lệnh thụt vào các dòng tiếp theo . Chỉ có dạng sau của bộ có thể chứa các câu lệnh ghép lồng nhau; những điều sau đây là bất hợp pháp, chủ yếu là vì sẽ không rõ ràng nếu mệnh đề một mệnh đề khác sau đây sẽ thuộc về:
if test1: if test2: print x
Cũng lưu ý rằng dấu chấm phẩy liên kết chặt chẽ hơn dấu hai chấm trong ngữ cảnh này, do đó, trong ví dụ sau, tất cả hoặc không có câu lệnh in nào được thực thi:
if x < y < z: print x; print y; print z
Tóm tắt:
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)* [";"]
if cond: stmt1; stmt2; stmt3
ví dụ đó , tất cả hoặc không có câu lệnh nào được thực thi ".
Python sử dụng ;
như một dấu phân cách, không phải là dấu kết thúc. Bạn cũng có thể sử dụng chúng ở cuối dòng, điều này làm cho chúng trông giống như một dấu kết thúc câu lệnh, nhưng điều này chỉ hợp pháp vì các câu lệnh trống là hợp pháp trong Python - một dòng có dấu chấm phẩy ở cuối là hai câu lệnh, câu thứ hai một trống
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
Đọc xong câu trả lời, tôi vẫn bỏ lỡ một khía cạnh quan trọng của việc sử dụng dấu chấm phẩy, có thể là khía cạnh duy nhất mà nó thực sự tạo ra sự khác biệt ...
Khi bạn đang làm việc trong trình thông dịch REPL (trình vỏ tương tác Python, IDLE, ipython), giá trị của biểu thức cuối cùng được in ra màn hình và thông thường đây là hành vi dự định.
Nhưng trong một số trường hợp, bạn chỉ muốn đánh giá một biểu thức cho các tác dụng phụ của nó, ví dụ, để xem kết quả mô phỏng của bạn được vẽ theo matplotlib
.
Trong trường hợp này, bạn (có lẽ) không muốn nhìn thấy màn hình của repr
các matplotlib
đối tượng đôi khi được trả về bởi một lệnh gọi matplotlib
và trong IPython, ít nhất, một trong những khả năng bạn có là nối thêm dấu chấm phẩy vào quá mức verbose tuyên bố, bây giờ IPython thấy dòng đầu vào như sáng tác bởi hai biểu thức, các matplotlib
gọi và một tuyên bố null, do đó giá trị của biểu thức hợp chất là None
và không có gì được in ra màn hình bằng cách thông dịch (khả năng khác là chuyển nhượng , như trong _ = plot(...)
nhưng tôi thấy rằng một chút xâm nhập).
IMHO, việc sử dụng dấu chấm phẩy để triệt tiêu đầu ra không mong muốn trong trình thông dịch đã trở nên phù hợp hơn sau khi giới thiệu sổ ghi chép IPyton, cho phép lưu đầu vào và đầu ra, bao gồm đầu ra đồ họa, của phiên dịch cho tài liệu và sử dụng lại cuối cùng .
ipython
... Tôi đã chỉnh sửa câu trả lời của mình để phản ánh nhận xét của bạn.
Như mọi người khác đã lưu ý, bạn có thể sử dụng dấu chấm phẩy để phân tách các câu lệnh. Bạn không cần phải như vậy, và đó không phải là phong cách thông thường.
Về lý do tại sao điều này hữu ích, một số người thích đặt hai hoặc nhiều câu ngắn thực sự tầm thường trên một dòng (cá nhân tôi nghĩ rằng điều này biến một số dòng dễ dàng bị bỏ qua thành một dòng trông phức tạp và làm cho khó thấy rằng nó tầm thường hơn) .
Nhưng đó gần như là một yêu cầu khi bạn gọi Python một lớp lót từ vỏ bằng cách sử dụng python -c '<some python code>'
. Ở đây bạn không thể sử dụng thụt lề để phân tách các câu lệnh, vì vậy nếu một lớp lót của bạn thực sự là một lớp lót hai lớp, bạn sẽ cần sử dụng dấu chấm phẩy. Và nếu bạn muốn sử dụng các đối số khác trong một lớp, bạn sẽ phải nhập sys
để truy cập sys.argv
, yêu cầu một import
câu lệnh riêng . ví dụ
python -c "import sys; print ' '.join(sorted(sys.argv[1:]))" 5 2 3 1 4
1 2 3 4 5
python
trong trình bao: Chỉ cần mở rộng mã được trích dẫn của bạn qua nhiều dòng hoặc sử dụng một di sản. Tuy nhiên, điều đó không thành công nếu bạn muốn nó là "một lớp lót". ;)
-c
Tôi nhận ra tôi thiên vị như một lập trình viên C cũ, nhưng có những lúc các quy ước Python khác nhau khiến mọi thứ khó theo dõi. Đôi khi tôi thấy quy ước thụt lề hơi khó chịu.
Đôi khi, sự rõ ràng khi một câu lệnh hoặc khối kết thúc là rất hữu ích. Mã C tiêu chuẩn thường sẽ đọc một cái gì đó như thế này:
for(i=0; i<100; i++) {
do something here;
do another thing here;
}
continue doing things;
nơi bạn sử dụng khoảng trắng cho nhiều sự rõ ràng - và thật dễ dàng để xem nơi vòng lặp kết thúc.
Python không cho phép bạn chấm dứt bằng dấu chấm phẩy (tùy chọn). Như đã lưu ý ở trên, điều đó KHÔNG có nghĩa là có một câu lệnh được thực thi theo sau bởi một câu lệnh 'null'. Ví dụ,
print(x);
print(y);
Giống như
print(x)
print(y)
Nếu bạn tin rằng câu đầu tiên có câu lệnh null ở cuối mỗi dòng, hãy thử - như được đề xuất - thực hiện việc này:
print(x);;
Nó sẽ ném một lỗi cú pháp.
Cá nhân, tôi tìm thấy dấu chấm phẩy để làm cho mã dễ đọc hơn khi bạn có nhiều hàm và hàm với nhiều đối số và / hoặc các đối số được đặt tên dài. Vì vậy, trong mắt tôi, điều này rõ ràng hơn nhiều so với các lựa chọn khác:
if some_boolean_is_true:
call_function(
long_named_arg_1,
long_named_arg_2,
long_named_arg_3,
long_named_arg_4
);
vì, với tôi, nó cho bạn biết rằng ')' cuối cùng kết thúc một số 'khối' chạy qua nhiều dòng.
Cá nhân tôi nghĩ rằng có rất nhiều hướng dẫn về phong cách PEP, các IDE thực thi chúng và niềm tin rằng "chỉ có một cách Pythonic để làm mọi thứ". Nếu bạn tin vào điều sau, hãy xem cách định dạng số: hiện tại, Python hỗ trợ bốn cách khác nhau để làm điều đó.
Tôi chắc chắn rằng tôi sẽ bị một số người chết, nhưng trình biên dịch / trình thông dịch không quan tâm nếu các đối số có tên dài hay ngắn, và - nhưng đối với quy ước thụt lề trong Python - không quan tâm đến khoảng trắng. Vấn đề lớn nhất với mã là đưa ra sự rõ ràng cho một người khác (và thậm chí chính bạn sau nhiều tháng làm việc) để hiểu những gì đang xảy ra, nơi mọi thứ bắt đầu và kết thúc, v.v.
Dấu chấm phẩy là một phần của cú pháp hợp lệ: 8. Câu lệnh ghép (Tham chiếu ngôn ngữ Python)
Một trích dẫn từ " Khi Pythons tấn công "
Đừng chấm dứt tất cả các tuyên bố của bạn bằng dấu chấm phẩy. Về mặt kỹ thuật để làm điều này trong Python, nhưng hoàn toàn vô dụng trừ khi bạn đặt nhiều hơn một câu lệnh trên một dòng (ví dụ: x = 1; y = 2; z = 3).
x,y,z = 1,2,3
?
x, y, z = 1, 2, 3
là chậm hơn vì nó phát sinh một chuyến đi khứ hồi không cần thiết để xây dựng một tuple và sau đó ngay lập tức coi thường nó. (Bằng cách này, tôi không thực sự nghĩ @communistpancake được cho thấy các x=1; y=2; z=3
mô hình mặc dù tôi nghĩ anh ấy / cô ấy chỉ đơn thuần là đưa ra một ví dụ về cách thức chấm phẩy là một dấu phân cách chứ không phải là một terminator..)
Nhiều câu lệnh trên một dòng có thể bao gồm dấu chấm phẩy dưới dạng dấu phân cách. Ví dụ: http://docs.python.org/reference/compound_stmts.html Trong trường hợp của bạn, việc này dễ dàng chèn một điểm để đột nhập vào trình gỡ lỗi.
Ngoài ra, như Mark Lutz đã đề cập trong Sách học Python , về mặt kỹ thuật (mặc dù không cần thiết và gây phiền nhiễu) là chấm dứt tất cả các tuyên bố của bạn bằng dấu chấm phẩy.
Dấu chấm phẩy có thể được sử dụng cho một dòng hai hoặc nhiều lệnh. Chúng không phải được sử dụng, nhưng chúng không bị hạn chế.
Dấu chấm phẩy (;) cho phép nhiều câu lệnh trên một dòng được đưa ra mà không câu lệnh nào bắt đầu một khối mã mới.
http://www.tutorialspoint.com/python/python_basic_syntax.htmlm
Dấu chấm phẩy (như dấu chấm, dấu phẩy và dấu ngoặc đơn) có xu hướng gây ra các cuộc chiến tôn giáo. Tuy nhiên, chúng (hoặc một số biểu tượng tương tự) hữu ích trong bất kỳ ngôn ngữ lập trình nào vì nhiều lý do.
Thực tế: khả năng đặt một số lệnh ngắn thuộc về khái niệm trên cùng một dòng. Một văn bản chương trình trông giống như một con rắn hẹp có tác dụng ngược lại với những gì được dự định bởi dòng mới và thụt đầu dòng, đó là cấu trúc nổi bật.
Về mặt khái niệm: tách mối quan tâm giữa cú pháp thuần túy (trong trường hợp này, đối với một chuỗi lệnh) từ cách trình bày (ví dụ: dòng mới), trong những ngày xưa gọi là "in ấn đẹp".
Quan sát: để làm nổi bật cấu trúc, thụt đầu dòng có thể được tăng / thay thế bằng các đường thẳng đứng theo cách rõ ràng, đóng vai trò là "thước đo thị giác" để xem nơi bắt đầu và kết thúc thụt. Các màu khác nhau (ví dụ: tuân theo mã màu cho điện trở) có thể bù cho sự đông đúc.
Nó được cho phép bởi vì các tác giả đã quyết định cho phép nó: https://docs.python.org/2/reference/simple_stmts.html
Nếu chuyển sang câu hỏi tại sao các tác giả quyết định làm như vậy, tôi đoán là như vậy bởi vì cột bán được phép là chấm dứt câu lệnh đơn giản ít nhất trong các ngôn ngữ sau: C ++, C, C #, R, Matlab, Perl, ...
Vì vậy, sẽ nhanh hơn khi chuyển sang sử dụng Python cho những người có nền tảng ngôn ngữ khác. Và không có mất tính tổng quát trong deicison như vậy.
Dấu chấm phẩy (";") chỉ cần để phân tách các câu lệnh trong cùng một khối, chẳng hạn như nếu chúng ta có mã C sau:
if(a>b)
{
largest=a; //here largest and count are integer variables
count+=1;
}
Nó có thể được viết bằng Python ở một trong hai dạng sau:
if a>b:
largest=a
count=count+1
Hoặc là
if a>b: largest=a;count=count+1
Trong ví dụ trên, bạn có thể có bất kỳ số lượng câu lệnh nào trong một if
khối và có thể được phân tách bằng dấu ";" thay thế.
Mong rằng không có gì đơn giản như lời giải thích ở trên.
Thêm vào kiến thức rộng lớn có mặt ở đây,
Đây là một câu trả lời liên quan đến thư viện matplotlib
import numpy as np
import matplotlib as plt
%matplotlib notebook
linear_data = np.array([1, 2, 3, 4, 5, 6, 7, 8])
quadratic_data = linear_data**2
plt.figure()
xvals = range(len(linear_data))
plt.barh(xvals, linear_data, height = 0.3, color='b')
plt.barh(xvals, quadratic_data, height = 0.3, left=linear_data, color='r')
Nếu bạn không cung cấp dấu chấm phẩy ở cuối barh (thanh ngang), đầu ra là một âm mưu + một địa chỉ hàm. Nhưng nếu bạn sử dụng dấu chấm phẩy ở cuối cả hai dòng barh, thì nó chỉ hiển thị âm mưu và triệt tiêu đầu ra cho địa chỉ hàm.
Một cái gì đó như thế này: So sánh