2013-03-20 36 views
5

Đây là những gì they có:Về ví dụ dãy số Fibonacci trong chức năng hướng dẫn Python của

def fib(n): 
    a, b = 0, 1 
    while a < n: 
     print a, 
     a, b = b, a+b 

Đây là những gì tôi có:

def fib(n): 
    a = 0 
    b = 1 
    while a < n: 
     print a 
     a = b 
     b = b+a 

Lợi nhuận đầu tiên trình tự chính xác khi sử dụng, trong khi tiền của tôi 0, 1, 2, 4, 8, 16, 32 ...

Tôi hiện đang học lập trình (không có giáo dục khoa học máy tính trước đây) và rõ ràng vấn đề là cách tôi đã xác định biến. Sự khác nhau giữa việc tách các biến bằng dấu phẩy và tách biến bằng một dòng mới (giả sử đó là vấn đề) là gì?

Trả lời

8

Đây là một nhiệm vụ tuple:

a, b = 0, 1 

Bạn cũng có thể nghĩ về nó như

(a, b) = (0, 1) 

Một tuple tạm thời được tạo ra với các giá trị 0, và 1 và sau đó giải nén vào biến ab

Đây cũng là nhiệm vụ tuple

a, b = b, a+b 

Một lần nữa, bạn có thể nghĩ về nó như

(a, b) = (b, a+b) 

Các tuple tạm thời được tạo ra từ các giá trị của ba+btrước khi một trong hai trong số họ được cập nhật. Việc chuyển nhượng chỉ xảy ra sau bộ tạm thời được tạo.

Bằng cách chia nhỏ ra các bước riêng biệt, bạn đang thay đổi ý nghĩa của mã.

Cho phép xem những gì xảy ra ở đây

a, b = 0, 1  # a=0 , b=1 
a, b = b, a+b  # a=1 , b=1 

Hãy so sánh với

a = 0    # a=0 
b = 1    # a=0 , b=1 
a = b    # a=1 , b=1 
b = b+a   # a=1 , b=2 
+0

Đây chính xác là những gì tôi cần biết (không quen thuộc với nguyên tắc phân công tuple). Cảm ơn bạn. – user2189389

5

Chỉ có một sự khác biệt:

Trong giai đoạn đầu, sự phân công b = b+a được thực hiện trước khi sửa đổi a. Điều này là do, cả hai biểu thức trong RHS được đánh giá đầu tiên, trước khi bất kỳ nhiệm vụ được thực hiện.

Trong khi ở bước thứ hai, nhiệm vụ thứ 2 được thực hiện sau khi sửa đổi a. Đó là lý do tại sao bạn thấy kết quả sai.

Vì vậy, trong mã của bạn:

b = b + a 

thực sự là:

b = b + b 

a đã được gán giá trị của b.

+0

Xin lỗi, nhưng điều này không phải là trực giác rõ ràng với tôi, nhưng đó là bởi vì tôi vẫn đang cố gắng để đạt được một sự hiểu biết về cú pháp chính nó. Nhìn vào ví dụ đầu tiên, b = b + a được chỉ định trước như thế nào? Và tôi đã cố gắng trao đổi vị trí của a = b và b = b + a trong mã của tôi, nhưng nó không ảnh hưởng đến đầu ra. EDIT: Tôi thấy thứ tự gán biến thứ tự của tôi là sai, nhưng tôi cũng đọc hướng dẫn theo thứ tự đó. Bởi vì có vẻ như sắp được giao lại cho tôi. – user2189389

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