2015-10-08 17 views
9

Di chuyển đến python với nền C/Java, gần đây tôi đã phải thực hiện đệ quy lẫn nhau, nhưng một số thứ trong python đang làm phiền tôi:Làm thế nào để python thực hiện đệ quy lẫn nhau?

vì chương trình python được diễn giải từng dòng, nếu tôi có hai hàm trong cùng một file python:

def A(n): 
    B(n-1) 
# if I add A(1) here, it gives me an error 
def B(n): 
    if n <= 0: 
     return 
    else: 
     A(n-1) 

Khi người phiên dịch đang đọc A, B chưa được xác định, tuy nhiên mã này không không cho tôi một lỗi

TL; DR hiểu biết của tôi là, khi def được giải thích, trăn cho biết thêm một mục nhập cho một số không gian tên địa phương locals() với {"function name": function address}, nhưng như đối với các cơ quan chức năng, nó chỉ làm một kiểm tra cú pháp:

def A(): 
    blabla # this will give an error 

def B(): 
    print x # even though x is not defined, this does not give an error 
    A()  # same as above, NameError is only detected during runtime 
+3

Một 'SyntaxError' sẽ bị bắt tại thời gian biên dịch, nhưng hầu hết các lỗi khác (' NameError', 'ValueError', v.v.) sẽ chỉ bị bắt khi chạy, và sau đó chỉ khi hàm đó được gọi. – TigerhawkT3

+1

dễ dàng, đủ để kiểm tra phải không? 'def f(): lỗi sytax' làm lỗi sản phẩm ... – yurib

Trả lời

4

Một SyntaxError sẽ bị bắt lúc biên dịch, nhưng hầu hết các lỗi khác (NameError, ValueError, vv) sẽ bị bắt chỉ trong thời gian chạy, và sau đó chỉ khi hàm được gọi.

"nếu tôi đã viết chức năng, nếu nó không được gọi trong thử nghiệm của tôi .." - và đó là lý do tại sao bạn nên kiểm tra mọi thứ.

Một số IDE sẽ tăng cảnh báo trong các tình huống khác nhau, nhưng tùy chọn tốt nhất vẫn là tiến hành tự kiểm tra kỹ lưỡng. Bằng cách này, bạn cũng có thể kiểm tra các lỗi phát sinh thông qua các yếu tố như đầu vào của người dùng, kiểm tra tự động của IDE sẽ không bao gồm.

+0

Tôi chỉ phát hiện ra rằng python có thể biên dịch WOW ... nhưng tại sao python không kiểm tra cho NameError lúc biên dịch?một cái gì đó như ** def A(): in x ** có thể dễ dàng phát hiện mà không thực sự cấp phát bộ nhớ (bạn biết như trình biên dịch c/C++) – watashiSHUN

+0

[phương pháp này để kiểm tra cú pháp] (http://stackoverflow.com/questions/4284313/how-can-i-check-the-syntax-of-python-script-without-executing-it) cũng tạo mã nhị phân ... nếu tất cả _compile_ thực hiện cú pháp kiểm tra, điều đó có nghĩa là đầu ra nhị phân có thể có nhiều lỗi và do đó vô dụng? – watashiSHUN

+0

Các ngôn ngữ khác cũng có thể có lỗi thời gian chạy không bị bắt. Ví dụ, trong Java, bạn có thể gõ vào một kiểu không chính xác và trình biên dịch sẽ không phàn nàn. Đây là lý do tại sao bạn nên kiểm tra chương trình của bạn đúng cách, để nó không "có nhiều lỗi" và hóa ra là "vô dụng". – TigerhawkT3

4

Dòng B(n-1) nói "khi câu lệnh này được thực hiện, tra cứu một số hàm B trong phạm vi mô-đun, sau đó gọi nó với tham số n-1". Do tra cứu xảy ra khi hàm được thực thi, B có thể được xác định sau.

(Ngoài ra, bạn có thể hoàn toàn ghi đè B với một chức năng khác nhau, và A sẽ gọi mới B sau đó. Nhưng điều đó có thể dẫn đến một số mã khó hiểu.)

Nếu bạn đang lo lắng về việc không bắt cuộc gọi đến các hàm không tồn tại, bạn có thể thử sử dụng các công cụ phân tích tĩnh. Ngoài ra, hãy chắc chắn bạn đang kiểm tra mã của mình.

0

Khi người phiên dịch đang đọc A, B vẫn chưa được xác định, tuy nhiên mã này không cung cấp cho tôi một lỗi

Lý do tại sao python thông dịch viên không đưa ra một lỗi có thể được tìm thấy từ docs , được gọi là forward reference về mặt kỹ thuật:

Độ phân giải tên của các biến miễn phí xảy ra trong thời gian chạy, không phải lúc biên dịch.

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