2010-09-20 35 views
53

Có thể gọi một chức năng mà không định nghĩa đầy đủ nó không? Khi cố gắng này tôi nhận được lỗi: "function_name không được xác định". Tôi đến từ một nền C++ vì vậy vấn đề này stumps tôi.Chức năng khai báo ở cuối tập tin bằng Python

Tuyên bố chức năng trước khi công trình:

def Kerma(): 
     return "energy/mass"  

print Kerma() 

Tuy nhiên, cố gắng để gọi hàm mà không cần xác định nó mang lại rắc rối:

print Kerma() 

def Kerma(): 
    return "energy/mass" 

Trong C++, bạn có thể khai báo một hàm sau khi cuộc gọi một lần bạn đặt tiêu đề của nó trước nó.

Tôi có thiếu gì đó ở đây không?

+3

Trong Python không có "tuyên bố". Có định nghĩa (phải hoàn chỉnh) hoặc không có gì. –

+2

Bạn nói, "nó gây rắc rối". bạn có thể giải thích về điều đó không? –

+0

Bản sao có thể có của [Các hàm khai báo trong python sau khi gọi] (http://stackoverflow.com/questions/17953219/declaration-functions-in-python-after-call) – user

Trả lời

93

Một cách đó là loại thành ngữ trong Python được viết:

def main(): 
    print Kerma() 

def Kerma(): 
    return "energy/mass"  

if __name__ == '__main__': 
    main() 

này cho phép bạn viết mã bạn theo thứ tự bạn thích miễn là bạn giữ gọi hàm main ở cuối.

+1

@Muhammad: trong khi đây là một cách tiếp cận khả thi, nó chắc chắn không phải là thành ngữ trong Python. Hoàn toàn ngược lại, bạn sẽ nhận thấy hầu hết các hàm 'main' thường được đặt ở cuối. –

+8

@Eli Bendersky: Tôi muốn gửi rằng nút 'if __name__ == '__main __':' là phần thành ngữ chung. –

+2

@Eli: phần thành ngữ là mệnh đề if ở cuối: không có mã ở cấp cao nhất của mô-đun, sau đó ở cuối gọi hàm chính nếu mô-đun là __main__. –

7

Điều này là không thể trong Python, nhưng nói thẳng thắn bạn sẽ sớm thấy bạn không cần nó chút nào. Cách Pythonic để viết mã là chia chương trình của bạn thành các mô-đun xác định các lớp và chức năng, và một "mô đun chính" duy nhất để nhập tất cả các phần mềm khác và chạy.

Đối với các kịch bản lệnh đơn giản được sử dụng để đặt "phần thực thi" ở cuối hoặc tốt hơn, hãy tìm hiểu cách sử dụng trình bao Python tương tác.

1

Python là một tính năng động và trình thông dịch luôn nhận trạng thái của các biến (hàm, ...) khi chúng đang ở thời điểm gọi chúng. Bạn thậm chí có thể xác định lại các chức năng trong một số khối if và gọi chúng theo từng thời điểm khác nhau. Đó là lý do tại sao bạn phải định nghĩa chúng trước khi gọi chúng.

11

Khi mô-đun Python (.py file) được chạy, các câu lệnh mức cao nhất trong nó được thực hiện theo thứ tự chúng xuất hiện, từ trên xuống dưới (từ đầu đến cuối). Điều này có nghĩa là bạn không thể tham khảo một cái gì đó cho đến khi bạn đã xác định nó. Ví dụ sau đây sẽ tạo ra lỗi hiển thị:

c = a + b # -> NameError: name 'a' is not defined 
a = 13 
b = 17 

Không giống với nhiều ngôn ngữ khác, defclass báo cáo là thực thi bằng Python — không chỉ tường thuật — để bạn có thể không tham khảo hoặc cho đến khi điều đó xảy ra và chúng được xác định. Đây là lý do tại sao ví dụ đầu tiên của bạn gặp sự cố — bạn đang tham chiếu hàm Kerma() trước câu lệnh def của nó đã được xử lý và đối tượng hàm được liên kết với tên của hàm, vì vậy nó không được xác định tại điểm đó trong tập lệnh.

Các chương trình bằng các ngôn ngữ như C++ thường được xử lý trước khi chạy và trong giai đoạn biên dịch này, toàn bộ chương trình và bất kỳ tệp nào được đọc và xử lý cùng một lúc. Không giống như Python, ngôn ngữ này có các câu lệnh khai báo cho phép tên và chuỗi các hàm (hoặc kiểu biến tĩnh) được khai báo (nhưng không được định nghĩa), trước khi sử dụng sao cho khi trình biên dịch gặp tên của chúng, nó có đủ thông tin để kiểm tra sử dụng, chủ yếu đòi hỏi phải kiểm tra loại và loại chuyển đổi, không ai trong số đó yêu cầu nội dung thực tế của họ hoặc cơ quan mã đã được xác định được nêu ra.

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