2015-05-21 21 views
5

tôi thấy khó có thể định dạng số với Julia:julia @printf thay đổi biến tôi

b = 1.111111 
bb = @printf "test : %5.2f" b 
bb 

test : 1.11 

Đó là tốt.

using PyPlot 
annotate(@printf "test : %5.2f" b, xy=[1;1]) 

test : 
type: non-boolean (Array{Bool,1}) used in boolean context 
while loading In[16], in expression starting on line 2 

Điều đó tôi không hiểu vì tôi mong đợi kết quả của @printf thành chuỗi. Vì vậy, nếu ai đó có thể giải thích cho tôi cách tôi nên làm những gì sẽ là

bằng Python.

Và để kết luận, đây là điều kỳ lạ:

b 
1 

b đã được đúc để một Int. Bạn sẽ gọi đó là một lỗi?

Tôi sử dụng Julia 0.3.2 với Jupyter 3.1

Trả lời

12

Phân tích cú pháp macro (đặc biệt trong ngữ cảnh cuộc gọi hàm) hơi khó tính. Bạn có thể xem cách Julia phân tích cú pháp này đơn giản bằng cách trích dẫn nó:

julia> :(annotate(@printf "test : %5.2f" b, xy=[1;1])) 
:(annotate(@printf "test : %5.2f" (b,xy) = [1,1])) 

Như bạn có thể thấy, macro "tham lam" hơn đối số hàm. Toàn bộ phần b, xy=[1;1] được lấy làm đối số duy nhất cho macro @printf. Điều này giải thích lý do tại sao giá trị của các thay đổi b - các = đã thay đổi ngữ cảnh từ biểu thị một đối số từ khóa thành một nhiệm vụ tuple chung!

tôi khuyên bạn nên sử dụng cú pháp chức năng giống như cho các macro khi sử dụng chúng trong biểu thức phức tạp hơn như thế này:

annotate(@sprintf("test : %5.2f", b), xy=[1;1]) 

Và, cuối cùng, lưu ý rằng tôi đã thay đổi @printf-@sprintf. Lợi nhuận trước đây là nothing và chỉ cần in giá trị ra, trong khi thứ hai trả về một chuỗi mà bạn có thể chuyển tới hàm.

+0

cảm ơn câu trả lời và mẹo để xem cách Julia phân tích cú pháp macro. – Olric

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