2012-02-23 22 views
7

Có cách nào để thực thi hàm eval giống như coerces giá trị của nó với dấu phẩy động không? Tôi hy vọng sẽPython: eval() kết hợp các giá trị với dấu phẩy động?

eval('1/3') 

và có nó trả về giá trị dấu chấm động 0,333333 chứ không phải là giá trị số nguyên 0.

+2

Trong phiên bản Python ...? ...? –

+0

mở cho các phương thức trong bất kỳ phiên bản nào của python. –

Trả lời

15

Grab trình biên dịch cờ cho __future__.division, vượt qua nó và mã của bạn để compile(), sau đó chạy eval() trên đối tượng đang quay trở lại.

(lưu ý bởi mh) Điều này có lợi thế nhất là không thay đổi hoạt động phân chia trên toàn cầu, có thể có tác dụng phụ không mong muốn. (cuối note)

>>> import __future__ 
>>> eval(compile('1/3', '<string>', 'eval', __future__.division.compiler_flag)) 
0.33333333333333331 
+0

Điều này là hoàn hảo, chính xác những gì tôi cần. Đặc biệt tốt là nó không thay đổi môi trường toàn cầu, mà có thể có thể có tác dụng phụ bất ngờ trong các phần khác của chương trình. Tôi sẽ cập nhật ví dụ của bạn để hiển thị rõ ràng việc nhập và sử dụng cờ trình biên dịch. Cảm ơn!! –

+0

Ồ, thật dễ thương, chỉ thấy điều này. :-) – kindall

+0

Tôi có thể giới hạn số thập phân thành hai không? – Jim

6

Bạn câu hỏi thực sự là: làm thế nào tôi có thể nhận Python để làm phân dấu chấm động theo mặc định. Câu trả lời là:

from __future__ import division 
+0

thực sự không, tôi sẽ nếu có thể bật nó chỉ để đánh giá biểu thức đã nhập. Nhưng, không thể làm điều đó, điều này sẽ làm việc tốt. Cảm ơn! –

+0

Cài đặt '__future__' là mỗi mô-đun để bạn có thể thực hiện nó trong một mô-đun riêng biệt, nhưng cách của Ignacio tốt hơn. – kindall

2

Vấn đề là không có giá trị float trong biểu thức.

thử này eval('1/3.0')

2

này hoạt động bằng cách mặc định trên Python3

Python 3.2 (r32:88445, Dec 8 2011, 15:26:51) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> eval("1/3") 
0.3333333333333333 

Đối python2 bạn có thể vượt qua -Qnew trên dòng lệnh (tương đương với from __future__ import division

$ python -Qnew 
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> eval("1/3") 
0.3333333333333333 
1

Dựa trên Lafada của trả lời, nếu bạn nhận được chuỗi đầu vào từ một biến:

>>> string = '1/3' 
>>> print eval(string+'.0') 
0.333333333333 
+0

Không thành công trên các biểu thức như 'string = (1/3)'. – Dilawar

+0

Biểu thức 'string = (1/3)' không tạo chuỗi. Nó tính toán 1/3, tạo ra một kết quả số nguyên là 0, sau đó lưu trữ kết quả trong một biến được gọi là chuỗi. Vì vậy, sau đó eval (string + '. 0') sẽ cố gắng ghép nối số nguyên bằng chuỗi ''.0''. Nó sẽ hoạt động nếu đầu vào của bạn là một chuỗi thực tế chưa được đánh giá trước một số nguyên. – Knowbody

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