2011-01-24 38 views
10

Tôi có một số nhầm lẫn về ý nghĩa hoặc định nghĩa của nó.Biểu thức bằng Python là gì?

Đó không phải là một số mã tạo hoặc tính toán giá trị dữ liệu mới? (Nói Zelle trong cuốn sách của mình)

Sau đó, tôi tự hỏi nếu một kiểu dữ liệu chuỗi là một biểu thức.

Nếu có, thì eval() sẽ làm gì khi đối số của nó là chuỗi?

Cuốn sách của Zelle cho biết eval(<string>) đánh giá string là một biểu thức, điều đó có nghĩa là gì nếu string đã là một biểu thức?

Và nếu string không phải là một biểu thức thì sao nó có thể xảy ra sau print?

+1

Có liên quan (nhưng ** không ** trùng lặp chính xác): [Sự khác biệt giữa Biểu thức và Tuyên bố là gì?] (Http://stackoverflow.com/questions/4728073/ python-what-is-the-sự khác biệt-giữa-một-biểu-và-một-tuyên bố) –

Trả lời

17

Biểu thức đại diện cho thứ gì đó, như số, chuỗi hoặc thể hiện của một lớp. Giá trị bất kỳ là một biểu thức!

Bất cứ điều gì mà làm điều gì đó là một tuyên bố. Bất kỳ gán nào cho một biến hoặc hàm gọi là một câu lệnh. Bất kỳ giá trị nào có trong câu lệnh đó trong một biểu thức.

foo = "hello" là câu lệnh gán foo cho giá trị của cụm từ "hello". Vì mã "hello" là một biểu thức đơn giản, có nghĩa là nó không chứa hoạt động, không có gì thực sự được đánh giá, do đó foo chỉ được gán cho "hello ". Biểu thức không là gì ngoài các giá trị, ngoại trừ chúng có thể có các phép toán như phép cộng hoặc trừ trừ. điều này kể từ mỗi giá trị đơn lẻ là một biểu thức. Nói "eval lấy giá trị làm đối số" đang nói chính xác điều tương tự, nhưng nó nghe có vẻ đơn giản hơn nhiều: D

eval("2+2") chuyển chuỗi "2+2" vào hàm. Chức năng đánh giá biểu thức chứa trong chuỗi, mà đi ra đến 4.

các cuốn sách của Zelle nói eval(<string>) đánh giá chuỗi như là một biểu hiện, những gì mà chính xác có nghĩa là nếu chuỗi đã là một biểu hiện?

Bất kỳ chuỗi nào là biểu thức vì nó biểu thị giá trị. Tuy nhiên, những gì trong chuỗi hoàn toàn không có tác động đến nó là một biểu thức. Nếu một giá trị của nó, một biểu thức của nó. Khi nó được "đánh giá như một biểu thức bằng eval", các ký tự bên trong chuỗi được thực thi như thể chúng là một biểu thức python.

+2

Giải thích tốt, ngoại trừ việc bạn không thể 'eval' câu lệnh: thử' eval ("print hello") 'trong Python 2.x. –

+6

Một cuộc gọi hàm là một biểu thức trong Python. Một biểu thức bất kỳ cũng là một câu lệnh - một "câu lệnh biểu thức". Xem thêm liên kết đến câu hỏi liên quan mà tôi đã đưa ra ở trên. –

+0

@Sven Tôi đang sử dụng định nghĩa khác về biểu thức vì mục đích đơn giản. Tôi nghĩ rằng để lại thông tin đó sẽ tránh sự phức tạp hơn, đặc biệt là vì các biểu thức như câu lệnh không được sử dụng rộng rãi. : D –

1

chuỗi là một biểu thức. Biểu thức là bất kỳ thứ gì có "giá trị". Giống như 3, 'Hello world', 1 + 1, math.sqrt (9), vv Tên hàm cũng là các biểu thức.

eval() cung cấp cho bạn giá trị của biểu thức mà bạn gán cho nó dưới dạng một chuỗi. Nếu bạn nói eval ('1 + 1') nó trả về 2. Vì vậy, nó trả về cùng mà sẽ được trả lại nếu bạn chỉ cần viết: 1 + 1.

+1

Ngoài ra: Mỗi phương pháp/chức năng trả về một giá trị cũng như một biểu thức. Vì vậy, eval chính nó là một biểu hiện một ví dụ tốt. – poke

+0

@poke: Đó là loại gây hiểu nhầm. _Every_ phương thức/hàm trả về một giá trị. Nếu bạn không trả lại bất cứ điều gì một cách rõ ràng, nó hoàn toàn trả về 'None'. (Tất nhiên trong thực tế, một cuộc gọi hàm cụ thể có thể tăng lên, 'sys.exit', quay mãi mãi trong một vòng lặp vô hạn, vv thay vì quay trở lại. Nhưng điều đó không làm cho biểu thức gọi hàm đó không phải là một biểu thức, hơn bất kỳ' 1/0'.) – abarnert

+0

@abarnert Khó nói bây giờ ý tôi là gì, nhưng tôi nghĩ ý tôi là tất cả những thứ đó cũng được tính là một biểu hiện, không chỉ là những biểu thức tĩnh chuẩn với một toán tử cơ bản nào ở giữa. – poke

2

"Biểu thức" có thể là cụm từ hơi khó hiểu khi bạn thoát khỏi suy nghĩ về cách trình phân tích cú pháp tập lệnh của Python hoạt động. standard documentation tạo ra sự khác biệt giữa các biểu thức và "nguyên tử", nhưng tôi nghĩ rằng thuật ngữ của nó khá hạn chế (sơ đồ BNF ở 5.11 ngụ ý rằng phải biểu hiện một cái gì đó phải là dạng lambda hoặc biểu thức có điều kiện. BNF của tôi bị gỉ.)

Nguyên tử, mặt khác, dường như có dạng @kynnysmatto nói 'bất cứ thứ gì có "giá trị". Có lẽ "bất kỳ thứ gì có thể được ngoặc đơn, và sau đó từ bên ngoài dấu ngoặc đơn không thể phân biệt được với giá trị tương ứng của nó" có thể là định nghĩa tốt hơn về nguyên tử.

Khi Zelle thảo luận về các biểu thức trong ngữ cảnh, ví dụ: eval (foo), tôi nghĩ anh ấy ngụ ý:

  • foo là một định danh, mà là một loại nguyên tử
  • nhưng foo là một định danh của một cái gì đó
  • này "cái gì đó" là chuỗi giống như , có thể là một chuỗi thực tế
  • trong nội bộ của eval(), chuỗi này cũng cấu thành "biểu thức" của Python - nghĩa là, Python có thể phân tích cú pháp và hiểu.

tl; dr: "expression" như thuật ngữ có thể được hiểu rõ nhất về phân tích mã; khi bạn tự lập trình, bạn có thể thấy tốt hơn khi nghĩ về "nguyên tử".

2

TL; DR: Biểu thức là kết hợp giá trị và toán tử và luôn luôn đánh giá xuống một giá trị duy nhất. Một tuyên bố là mọi hướng dẫn khác. Một số câu lệnh chứa các biểu thức.

Một biểu là một lệnh mà kết hợp các giá trị và các nhà khai thácluôn đánh giá xuống đến một giá trị duy nhất.

Ví dụ, đây là một biểu hiện:

>>> 2 + 2 

Các 2s là những giá trị số nguyên và dấu + là toán tử toán học. Biểu thức này đánh giá xuống đến giá trị số nguyên duy nhất 4.

Về mặt kỹ thuật, đây cũng là một biểu hiện:

>>> 4 

Là một biểu hiện, nó đánh giá xuống đến giá trị duy nhất 4.

Khi tôi nói giá trị và toán tử, điều này không giới hạn đối với các vấn đề về toán học:

>>> 'You will be ' + str(int(myAge) + 1) + ' next year.' 

Biến số myAge đánh giá giá trị bên trong nó. Hàm gọi int('5') đánh giá giá trị trả về của hàm, 5. Tất cả các giá trị chuỗi này được kết hợp với toán tử + (trong trường hợp này, đó là toán tử nối chuỗi).Không có vấn đề lớn như thế nào một biểu thức là, nó đánh giá xuống đến một giá trị duy nhất: trong trường hợp này, giá trị chuỗi 'You will be 6 next year.'

Contrast này với một tuyên bố , mà là một hướng dẫn Python mà không đánh giá xuống đến một giá trị. Một câu lệnh Python là khá nhiều thứ khác không phải là một biểu thức. Dưới đây là một tuyên bố phân:

>>> spam = 2 + 2 

Dưới đây là một câu lệnh if:

>>> if spam == 4: 

Dưới đây là một tuyên bố thời gian cho một vòng lặp vô hạn:

>>> while True: 

Lưu ý rằng cả hai báo cáo chứa các biểu thức (thậm chí True, đánh giá xuống giá trị đơn True). Nhưng không phải tất cả các câu lệnh đều sử dụng các biểu thức trong chúng. Đây là tuyên bố phá vỡ:

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