Hướng dẫn what happens when a function is called in python? - điều gì xảy ra khi một hàm được gọi trong python?

def không phải là một tuyên bố trong Python, đó là một tuyên bố thực thi. Trong thời gian chạy, nó truy xuất đối tượng mã được biên dịch cho hàm, kết thúc rằng trong một đối tượng chức năng được tạo động và liên kết kết quả với tên sau def. Ví dụ, hãy xem xét mã vô dụng này:

import dis
def f():
    def g():
        return 1
dis.dis(f)

Đây là một phần của đầu ra (Python 2.7.5 tại đây):

0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)

Tất cả điều này thường là một chi tiết vô hình, nhưng bạn có thể chơi một số thủ thuật tối nghĩa với nó ;-) Ví dụ, hãy nghĩ về mã này làm gì:

fs = []
for i in range(3):
    def f(arg=i**3):
        return arg
    fs.append(f)
print [f() for f in fs]

Đây là đầu ra:

[0, 1, 8]

Đó là bởi vì def thực thi tạo ra ba đối tượng chức năng riêng biệt, một cho mỗi lần thông qua vòng lặp. Vui vẻ tuyệt vời :-)


0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)
3 Định nghĩa không thể trống, nhưng nếu bạn vì một số lý do có định nghĩa
0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)
3 không có nội dung, hãy đưa vào câu lệnh
0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)
5 để tránh gặp lỗi.

Đệ quy

Python cũng chấp nhận đệ quy chức năng, có nghĩa là một hàm được xác định có thể tự gọi.


Recursion là một khái niệm toán học và lập trình phổ biến. Nó có nghĩa là một chức năng tự gọi. Điều này có lợi ích của ý nghĩa mà bạn có thể lặp qua dữ liệu để đạt được kết quả.

Nhà phát triển nên rất cẩn thận với đệ quy vì có thể khá dễ dàng để viết một chức năng không bao giờ chấm dứt hoặc sử dụng lượng bộ nhớ hoặc nguồn bộ xử lý dư thừa. Tuy nhiên, khi được viết chính xác đệ quy có thể là một cách tiếp cận rất hiệu quả và về mặt toán học để lập trình.def keyword:

Thí dụ

def my_function (quốc gia = "Na Uy"): & nbsp; in ("Tôi là từ" + quốc gia)
  print("Hello from a function")


my_function ("Thụy Điển") my_function ("Ấn Độ") my_function () my_function ("Brazil")

Chuyển một danh sách như một cuộc tranh luận

Thí dụ

def my_function (quốc gia = "Na Uy"): & nbsp; in ("Tôi là từ" + quốc gia)
  print("Hello from a function")

my_function()

Hãy tự mình thử »


my_function ("Thụy Điển") my_function ("Ấn Độ") my_function () my_function ("Brazil")

Chuyển một danh sách như một cuộc tranh luận

Bạn có thể gửi bất kỳ loại dữ liệu nào của đối số đến một hàm (chuỗi, số, danh sách, từ điển, v.v.) và nó sẽ được coi là cùng một loại dữ liệu bên trong hàm.

Ví dụ. Nếu bạn gửi một danh sách làm đối số, nó vẫn sẽ là một danh sách khi nó đạt đến chức năng:

Thí dụ

def my_function (fname): & nbsp; in (fname + "refsnes")fname):
  print(fname + " Refsnes")

my_function ("emil") my_function ("Tobias") my_function ("linus")"Emil")
my_function("Tobias")
my_function("Linus")

Hãy tự mình thử »

Các đối số thường được rút ngắn thành Args trong các tài liệu Python.



Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Từ quan điểm của một chức năng:

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.

Một đối số là giá trị được gửi đến hàm khi nó được gọi.


Số lượng đối số

Theo mặc định, một hàm phải được gọi với số lượng đối số chính xác. Có nghĩa là nếu chức năng của bạn mong đợi 2 đối số, bạn phải gọi hàm với 2 đối số, không nhiều hơn và không ít hơn.

Thí dụ

Hàm này mong đợi 2 đối số và nhận được 2 đối số:

def my_function (fname, lname): & nbsp; in (fname + "" + lname)
  print(fname + " " + lname)

my_function ("Emil", "refsnes")

Hãy tự mình thử »

Các đối số thường được rút ngắn thành Args trong các tài liệu Python.

Thí dụ

Tham số hoặc đối số?

def my_function (fname, lname): & nbsp; in (fname + "" + lname)
  print(fname + " " + lname)

my_function ("Emil", "refsnes")

Hãy tự mình thử »


Các đối số thường được rút ngắn thành Args trong các tài liệu Python.

Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Thí dụ

Từ quan điểm của một chức năng:

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.
  print("The youngest child is " + kids[2])

Một đối số là giá trị được gửi đến hàm khi nó được gọi.

Hãy tự mình thử »

Các đối số thường được rút ngắn thành Args trong các tài liệu Python.


Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Từ quan điểm của một chức năng:

Thí dụ

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.
  print("The youngest child is " + child3)

Một đối số là giá trị được gửi đến hàm khi nó được gọi.

Hãy tự mình thử »

Các đối số thường được rút ngắn thành Args trong các tài liệu Python.


Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Từ quan điểm của một chức năng:

Thí dụ

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.

Một đối số là giá trị được gửi đến hàm khi nó được gọi.
  print("His last name is " + kid["lname"])

Số lượng đối số

Hãy tự mình thử »

Các đối số thường được rút ngắn thành Args trong các tài liệu Python.


Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Từ quan điểm của một chức năng:

Thí dụ

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.country = "Norway"):
  print("I am from " + country)

Một đối số là giá trị được gửi đến hàm khi nó được gọi.
my_function("India")
my_function()
my_function("Brazil")

Hãy tự mình thử »


Các đối số thường được rút ngắn thành Args trong các tài liệu Python.

Tham số hoặc đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Thí dụ

Từ quan điểm của một chức năng:
  for x in food:
    print(x)

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.

Một đối số là giá trị được gửi đến hàm khi nó được gọi.

Hãy tự mình thử »


Các đối số thường được rút ngắn thành Args trong các tài liệu Python.

Tham số hoặc đối số?

Thí dụ

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.
  return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))

Hãy tự mình thử »


Các đối số thường được rút ngắn thành Args trong các tài liệu Python.

Tham số hoặc đối số?


Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một điều: thông tin được truyền vào một hàm.

Từ quan điểm của một chức năng:

Một tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm.

Một đối số là giá trị được gửi đến hàm khi nó được gọi.

Số lượng đối sốtri_recursion() is a function that we have defined to call itself ("recurse"). We use the k variable as the data, which decrements (-1) every time we recurse. The recursion ends when the condition is not greater than 0 (i.e. when it is 0).

Đối với một nhà phát triển mới, có thể mất một thời gian để tìm hiểu chính xác điều này hoạt động như thế nào, cách tốt nhất để tìm hiểu là bằng cách kiểm tra và sửa đổi nó.

Thí dụ

Ví dụ đệ quy

def tri_recursion (k): & nbsp; if (k> 0): & nbsp; & nbsp; & nbsp; result = k + tri_recursion (k - 1) & nbsp; & nbsp; & nbsp; in (kết quả) & nbsp; khác: & nbsp; & nbsp; & nbsp; kết quả = 0 & nbsp; Kết quả trả lại
  if(k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print ("\ n \ nrecursion Kết quả ví dụ") Tri_Recursion (6)
tri_recursion(6)

Hãy tự mình thử »


Kiểm tra bản thân với các bài tập

Exercise:

Tạo một hàm có tên

0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)
6.

:
  print("Hello from a function")

Bắt đầu bài tập



Điều gì xảy ra khi bạn gọi một chức năng trong Python?

Trong Python, các chức năng là các đối tượng hạng nhất. Điều này có nghĩa là chúng có thể "được tạo ra một cách linh hoạt, bị phá hủy, truyền cho một hàm, được trả lại như một giá trị và có tất cả các quyền như các biến khác trong ngôn ngữ lập trình có." Gọi một thể hiện chức năng/lớp trong Python có nghĩa là gọi phương thức __call__ của đối tượng đó.invoking the __call__ method of that object.

Điều gì xảy ra khi chức năng khi được gọi là?

Bây giờ, bất cứ khi nào một hàm được gọi là khung ngăn xếp mới được tạo với tất cả dữ liệu của hàm và khung ngăn xếp này được đẩy trong ngăn xếp chương trình và con trỏ ngăn xếp luôn hướng đến đỉnh của chương trình chỉ ra khung ngăn xếp được đẩyTrên đỉnh của ngăn xếp chương trình.a new stack frame is created with all the function's data and this stack frame is pushed in the program stack, and the stack pointer that always points the top of the program stack points the stack frame pushed as it is on the top of the program stack.

Điều gì được gọi là khi một hàm được gọi bên trong một hàm trong Python?

Một hàm được xác định bên trong một hàm khác được gọi là hàm lồng nhau.Các hàm lồng nhau có thể truy cập các biến của phạm vi kèm theo.Trong Python, các biến không cục bộ này chỉ được đọc theo mặc định và chúng ta phải khai báo chúng một cách rõ ràng là không cục bộ (sử dụng từ khóa không thuộc địa) để sửa đổi chúng.nested function. Nested functions can access variables of the enclosing scope. In Python, these non-local variables are read-only by default and we must declare them explicitly as non-local (using nonlocal keyword) in order to modify them.