Các chức năng được thực thi trong python như thế nào?

Một chương trình Python được xây dựng từ các khối mã. Một khối là một đoạn văn bản chương trình Python được thực thi dưới dạng một đơn vị. Sau đây là các khối. một mô-đun, một thân hàm và một định nghĩa lớp. Mỗi lệnh được nhập tương tác là một khối. Tệp tập lệnh [tệp được cung cấp làm đầu vào tiêu chuẩn cho trình thông dịch hoặc được chỉ định làm đối số dòng lệnh cho trình thông dịch] là một khối mã. Lệnh tập lệnh [lệnh được chỉ định trên dòng lệnh trình thông dịch với tùy chọn

i = 10
def f[]:
    print[i]
i = 42
f[]
1] là một khối mã. Mô-đun chạy dưới dạng tập lệnh cấp cao nhất [dưới dạng mô-đun
i = 10
def f[]:
    print[i]
i = 42
f[]
2] từ dòng lệnh sử dụng đối số
i = 10
def f[]:
    print[i]
i = 42
f[]
3 cũng là một khối mã. Đối số chuỗi được truyền cho các hàm tích hợp sẵn
i = 10
def f[]:
    print[i]
i = 42
f[]
4 và
i = 10
def f[]:
    print[i]
i = 42
f[]
5 là một khối mã

Một khối mã được thực thi trong một khung thực thi. Một khung chứa một số thông tin quản trị [được sử dụng để gỡ lỗi] và xác định vị trí và cách thức thực thi tiếp tục sau khi thực thi xong khối mã

4. 2. Đặt tên và ràng buộc¶

4. 2. 1. Ràng buộc tên¶

Tên đề cập đến các đối tượng. Tên được giới thiệu bởi hoạt động ràng buộc tên

Các cấu trúc sau liên kết tên

  • tham số hình thức cho hàm,

  • định nghĩa lớp,

  • định nghĩa hàm,

  • biểu thức gán,

  • mục tiêu là số nhận dạng nếu xuất hiện trong một nhiệm vụ.

    • Tiêu đề vòng lặp

      i = 10
      def f[]:
          print[i]
      i = 42
      f[]
      
      6,

    • sau

      i = 10
      def f[]:
          print[i]
      i = 42
      f[]
      
      7 trong câu lệnh
      i = 10
      def f[]:
          print[i]
      i = 42
      f[]
      
      8, mệnh đề
      i = 10
      def f[]:
          print[i]
      i = 42
      f[]
      
      0, mệnh đề
      i = 10
      def f[]:
          print[i]
      i = 42
      f[]
      
      1 hoặc trong as-pattern trong so khớp mẫu cấu trúc,

    • trong một mô hình chụp trong mô hình cấu trúc phù hợp

  • i = 10
    def f[]:
        print[i]
    i = 42
    f[]
    
    2 báo cáo

Câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
2 có dạng
i = 10
def f[]:
    print[i]
i = 42
f[]
4 liên kết tất cả các tên được xác định trong mô-đun đã nhập, ngoại trừ những tên bắt đầu bằng dấu gạch dưới. Biểu mẫu này chỉ có thể được sử dụng ở cấp mô-đun

Một mục tiêu xuất hiện trong câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
5 cũng được coi là bị ràng buộc cho mục đích này [mặc dù ngữ nghĩa thực tế là để bỏ ràng buộc tên]

Mỗi câu lệnh gán hoặc nhập xảy ra trong một khối được xác định bởi một lớp hoặc định nghĩa hàm hoặc ở cấp độ mô-đun [khối mã cấp cao nhất]

Nếu một tên bị ràng buộc trong một khối, nó là một biến cục bộ của khối đó, trừ khi được khai báo là

i = 10
def f[]:
    print[i]
i = 42
f[]
6 hoặc
i = 10
def f[]:
    print[i]
i = 42
f[]
7. Nếu một tên bị ràng buộc ở cấp độ mô-đun, thì đó là một biến toàn cục. [Các biến của khối mã mô-đun là cục bộ và toàn cục. ] Nếu một biến được sử dụng trong khối mã nhưng không được xác định ở đó, thì đó là biến tự do

Mỗi lần xuất hiện của một tên trong văn bản chương trình đề cập đến ràng buộc của tên đó được thiết lập bởi các quy tắc phân giải tên sau

4. 2. 2. Phân giải tên¶

Một phạm vi xác định khả năng hiển thị của một tên trong một khối. Nếu một biến cục bộ được xác định trong một khối, thì phạm vi của nó bao gồm cả khối đó. Nếu định nghĩa xảy ra trong một khối chức năng, phạm vi sẽ mở rộng đến bất kỳ khối nào có trong khối xác định, trừ khi một khối được chứa giới thiệu một ràng buộc khác cho tên

Khi một tên được sử dụng trong một khối mã, nó sẽ được giải quyết bằng cách sử dụng phạm vi kèm theo gần nhất. Tập hợp tất cả các phạm vi như vậy có thể nhìn thấy đối với một khối mã được gọi là môi trường của khối

Khi hoàn toàn không tìm thấy tên, một ngoại lệ

i = 10
def f[]:
    print[i]
i = 42
f[]
8 được đưa ra. Nếu phạm vi hiện tại là một phạm vi chức năng và tên đề cập đến một biến cục bộ chưa được liên kết với một giá trị tại điểm mà tên được sử dụng, một ngoại lệ
i = 10
def f[]:
    print[i]
i = 42
f[]
9 sẽ được đưa ra.
i = 10
def f[]:
    print[i]
i = 42
f[]
9 là một lớp con của
i = 10
def f[]:
    print[i]
i = 42
f[]
8

Nếu một hoạt động liên kết tên xảy ra ở bất kỳ đâu trong khối mã, thì tất cả việc sử dụng tên trong khối đó được coi là tham chiếu đến khối hiện tại. Điều này có thể dẫn đến lỗi khi một tên được sử dụng trong một khối trước khi nó bị ràng buộc. Quy tắc này là tinh tế. Python thiếu các khai báo và cho phép các hoạt động liên kết tên xảy ra ở bất kỳ đâu trong một khối mã. Các biến cục bộ của một khối mã có thể được xác định bằng cách quét toàn bộ văn bản của khối để tìm các thao tác liên kết tên

Nếu câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
7 xảy ra trong một khối, tất cả việc sử dụng các tên được chỉ định trong câu lệnh đều đề cập đến các ràng buộc của các tên đó trong không gian tên cấp cao nhất. Tên được giải quyết trong không gian tên cấp cao nhất bằng cách tìm kiếm không gian tên chung, tôi. e. không gian tên của mô-đun chứa khối mã và không gian tên nội trang, không gian tên của mô-đun
i = 10
def f[]:
    print[i]
i = 42
f[]
13. Không gian tên chung được tìm kiếm đầu tiên. Nếu không tìm thấy tên ở đó, không gian tên nội trang được tìm kiếm. Tuyên bố
i = 10
def f[]:
    print[i]
i = 42
f[]
7 phải đi trước tất cả các cách sử dụng tên được liệt kê

Câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
7 có cùng phạm vi với thao tác liên kết tên trong cùng một khối. Nếu phạm vi bao quanh gần nhất cho một biến tự do chứa một câu lệnh toàn cục, thì biến tự do đó được coi là một biến toàn cục.

Câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
6 khiến các tên tương ứng tham chiếu đến các biến bị ràng buộc trước đó trong phạm vi hàm kèm theo gần nhất.
i = 10
def f[]:
    print[i]
i = 42
f[]
17 được nâng lên tại thời điểm biên dịch nếu tên đã cho không tồn tại trong bất kỳ phạm vi chức năng kèm theo nào

Không gian tên cho mô-đun được tạo tự động khi lần đầu tiên mô-đun được nhập. Mô-đun chính của tập lệnh luôn được gọi là

i = 10
def f[]:
    print[i]
i = 42
f[]
2

Khối định nghĩa lớp và đối số cho

i = 10
def f[]:
    print[i]
i = 42
f[]
5 và
i = 10
def f[]:
    print[i]
i = 42
f[]
4 là đặc biệt trong bối cảnh phân giải tên. Định nghĩa lớp là một câu lệnh thực thi có thể sử dụng và xác định tên. Các tham chiếu này tuân theo các quy tắc thông thường để phân giải tên với một ngoại lệ là các biến cục bộ không liên kết được tra cứu trong không gian tên chung. Không gian tên của định nghĩa lớp trở thành từ điển thuộc tính của lớp. Phạm vi của các tên được xác định trong một khối lớp được giới hạn trong khối lớp; . Điều này có nghĩa là những điều sau đây sẽ thất bại

i = 10
def f[]:
    print[i]
i = 42
f[]
6

4. 2. 3. Thực thi tích hợp và hạn chế¶

Chi tiết triển khai CPython. Người dùng không nên chạm vào

i = 10
def f[]:
    print[i]
i = 42
f[]
21; . Người dùng muốn ghi đè các giá trị trong không gian tên nội trang nên
i = 10
def f[]:
    print[i]
i = 42
f[]
2 mô-đun
i = 10
def f[]:
    print[i]
i = 42
f[]
13 và sửa đổi các thuộc tính của nó một cách thích hợp

Không gian tên nội trang được liên kết với việc thực thi một khối mã thực sự được tìm thấy bằng cách tra cứu tên

i = 10
def f[]:
    print[i]
i = 42
f[]
21 trong không gian tên chung của nó; . Theo mặc định, khi ở trong mô-đun
i = 10
def f[]:
    print[i]
i = 42
f[]
2, thì
i = 10
def f[]:
    print[i]
i = 42
f[]
21 là mô-đun tích hợp sẵn
i = 10
def f[]:
    print[i]
i = 42
f[]
13;

4. 2. 4. Tương tác với các tính năng động¶

Việc phân giải tên của các biến tự do xảy ra trong thời gian chạy, không phải lúc biên dịch. Điều này có nghĩa là đoạn mã sau sẽ in ra 42

i = 10
def f[]:
    print[i]
i = 42
f[]

Các hàm

i = 10
def f[]:
    print[i]
i = 42
f[]
4 và
i = 10
def f[]:
    print[i]
i = 42
f[]
5 không có quyền truy cập vào môi trường đầy đủ để phân giải tên. Tên có thể được giải quyết trong không gian tên cục bộ và toàn cầu của người gọi. Các biến miễn phí không được giải quyết trong không gian tên kèm theo gần nhất, nhưng trong không gian tên chung. 1 Các hàm
i = 10
def f[]:
    print[i]
i = 42
f[]
5 và
i = 10
def f[]:
    print[i]
i = 42
f[]
4 có các đối số tùy chọn để ghi đè không gian tên toàn cục và cục bộ. Nếu chỉ có một không gian tên được chỉ định, thì nó được sử dụng cho cả hai

4. 3. Ngoại lệ¶

Ngoại lệ là phương tiện thoát ra khỏi luồng kiểm soát thông thường của khối mã để xử lý lỗi hoặc các điều kiện ngoại lệ khác. Một ngoại lệ được đưa ra tại điểm phát hiện lỗi;

Trình thông dịch Python đưa ra một ngoại lệ khi phát hiện lỗi thời gian chạy [chẳng hạn như chia cho 0]. Một chương trình Python cũng có thể đưa ra một ngoại lệ rõ ràng với câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
34. Trình xử lý ngoại lệ được chỉ định với câu lệnh
i = 10
def f[]:
    print[i]
i = 42
f[]
35 …
i = 10
def f[]:
    print[i]
i = 42
f[]
0. Mệnh đề
i = 10
def f[]:
    print[i]
i = 42
f[]
37 của một câu lệnh như vậy có thể được sử dụng để chỉ định mã dọn dẹp không xử lý ngoại lệ, nhưng được thực thi cho dù ngoại lệ có xảy ra hay không trong mã trước đó

Python sử dụng mô hình xử lý lỗi “chấm dứt”. một trình xử lý ngoại lệ có thể tìm ra điều gì đã xảy ra và tiếp tục thực thi ở cấp độ bên ngoài, nhưng nó không thể sửa nguyên nhân gây ra lỗi và thử lại thao tác bị lỗi [ngoại trừ bằng cách nhập lại đoạn mã vi phạm từ trên cùng]

Khi một ngoại lệ hoàn toàn không được xử lý, trình thông dịch sẽ chấm dứt thực thi chương trình hoặc quay lại vòng lặp chính tương tác của nó. Trong cả hai trường hợp, nó in một dấu vết ngăn xếp, trừ khi ngoại lệ là

i = 10
def f[]:
    print[i]
i = 42
f[]
38

Các ngoại lệ được xác định bởi các thể hiện của lớp. Mệnh đề

i = 10
def f[]:
    print[i]
i = 42
f[]
0 được chọn tùy thuộc vào lớp của thể hiện. nó phải tham chiếu lớp của thể hiện hoặc lớp cơ sở không ảo của nó. Trình xử lý có thể nhận được phiên bản và có thể mang thông tin bổ sung về điều kiện ngoại lệ.

Ghi chú

Thông báo ngoại lệ không phải là một phần của API Python. Nội dung của chúng có thể thay đổi từ phiên bản Python này sang phiên bản tiếp theo mà không có cảnh báo và không nên dựa vào mã sẽ chạy dưới nhiều phiên bản của trình thông dịch

Xem thêm mô tả về câu lệnh

i = 10
def f[]:
    print[i]
i = 42
f[]
35 trong phần Câu lệnh try và câu lệnh
i = 10
def f[]:
    print[i]
i = 42
f[]
34 trong phần . .

chú thích

1

Giới hạn này xảy ra do mã được thực thi bởi các hoạt động này không có sẵn tại thời điểm mô-đun được biên dịch

Làm thế nào chức năng được thực hiện?

Việc thực thi luôn bắt đầu từ câu lệnh đầu tiên của chương trình. Các câu lệnh được thực hiện lần lượt theo thứ tự từ trên xuống dưới . Các định nghĩa hàm không làm thay đổi luồng thực thi của chương trình, nhưng hãy nhớ rằng các câu lệnh bên trong hàm không được thực thi cho đến khi hàm được gọi.

Hàm LÀ GÌ và nó hoạt động như thế nào trong Python?

Một hàm là một khối mã chỉ chạy khi nó được gọi . Bạn có thể truyền dữ liệu, được gọi là tham số, vào một hàm. Kết quả là một hàm có thể trả về dữ liệu.

Chủ Đề