Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?


Tranh luận

Thông tin có thể được truyền vào các chức năng như đối số.

Đối số được chỉ định sau tên hàm, bên trong dấu ngoặc đơn. Bạn có thể thêm nhiều đối số như bạn muốn, chỉ cần tách chúng bằng dấu phẩy.

Ví dụ sau đây có một hàm với một đối số (fname). Khi chức năng được gọi, chúng tôi chuyển một tên đầu tiên, được sử dụng bên trong hàm để in tên đầy đủ:

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ụ

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

my_function ("emil") my_function ("Tobias") my_function ("linus")
  print(fname + " " + lname)

Hãy tự mình thử »

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.

my_function ("emil") my_function ("Tobias") my_function ("linus")
  print(fname + " " + lname)

Hãy tự mình thử »

Hãy tự mình thử »




Bởi Bernd Klein. Sửa đổi lần cuối: 29 tháng 6 năm 2022.Bernd Klein. Last modified: 29 Jun 2022.

Trên trang này

Một chức năng hoặc thủ tục thường cần một số thông tin về môi trường, trong đó nó đã được gọi. Giao diện giữa môi trường, từ đó hàm đã được gọi và hàm, tức là cơ thể hàm, bao gồm các biến đặc biệt, được gọi là tham số. Bằng cách sử dụng các tham số này, có thể sử dụng tất cả các loại đối tượng từ "bên ngoài" bên trong hàm. Cú pháp cho cách các tham số được khai báo và ngữ nghĩa về cách các đối số được truyền đến các tham số của hàm hoặc quy trình phụ thuộc vào ngôn ngữ lập trình.

Rất thường các thuật ngữ tham số và đối số được sử dụng đồng nghĩa, nhưng có một sự khác biệt rõ ràng. Các tham số là các hàm hoặc quy trình bên trong, trong khi các đối số được sử dụng trong các cuộc gọi thủ tục, tức là các giá trị được truyền đến hàm trong thời gian chạy.

"Gọi theo giá trị" và "Gọi theo tên"

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Chiến lược đánh giá cho các đối số, tức là cách các đối số từ một cuộc gọi hàm được truyền đến các tham số của hàm, khác nhau giữa các ngôn ngữ lập trình. Các chiến lược đánh giá phổ biến nhất là "cuộc gọi theo giá trị" và "cuộc gọi theo tài liệu tham khảo":

  • Gọi theo giá trị Chiến lược phổ biến nhất là đánh giá theo từng giá trị, đôi khi còn được gọi là giá trị qua. Chiến lược này được sử dụng trong C và C ++ chẳng hạn. Trong cuộc gọi-by-giá trị, biểu thức đối số được đánh giá và kết quả của đánh giá này được liên kết với biến tương ứng trong hàm. Vì vậy, nếu biểu thức là một biến, giá trị của nó sẽ được gán (sao chép) cho tham số tương ứng. Điều này đảm bảo rằng biến trong phạm vi của người gọi sẽ không thay đổi khi hàm trả về.

  • Gọi bằng tham chiếu trong đánh giá từng cuộc gọi, còn được gọi là tham chiếu qua từng lần, một hàm có một tham chiếu ngầm đến đối số, thay vì một bản sao giá trị của nó. Do đó, hàm có thể sửa đổi đối số, tức là giá trị của biến trong phạm vi của người gọi có thể được thay đổi. Bằng cách sử dụng cuộc gọi bằng tham chiếu, chúng tôi lưu cả thời gian tính toán và không gian bộ nhớ, bởi vì các đối số không cần phải sao chép. Mặt khác, điều này chứa chấp bất lợi rằng các biến có thể được "vô tình" thay đổi trong một cuộc gọi chức năng. Vì vậy, phải chăm sóc đặc biệt để "bảo vệ" các giá trị, không nên thay đổi. Nhiều ngôn ngữ lập trình hỗ trợ các tham chiếu gọi theo từng cuộc gọi, như C hoặc C ++, nhưng Perl sử dụng nó làm mặc định.

Trong Algol 60 và COBOL đã có một khái niệm khác gọi là Call-By-Name, không được sử dụng nữa trong các ngôn ngữ hiện đại.

Còn Python thì sao?

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Có một số cuốn sách gọi chiến lược của Python Call-by-giá trị, và một số người gọi nó là tham chiếu theo từng cuộc gọi. Bạn có thể tự hỏi mình, điều gì là đúng.

Humpty Dumpty cung cấp lời giải thích:

--- "Khi tôi sử dụng một từ", Humpty Dumpty nói, với một giai điệu khá khinh bỉ, "nó có nghĩa là những gì tôi chọn nó có nghĩa- không hơn cả không ít hơn."

--- "Câu hỏi là," Alice nói, "liệu bạn có thể nói những từ có nghĩa là rất nhiều điều khác nhau."

--- "Câu hỏi là," Humpty Dumpty nói, "đó là chủ nhân- đó là tất cả."

Lewis Carroll, thông qua kính nhìn

Để quay lại câu hỏi ban đầu của chúng tôi, chiến lược đánh giá nào được sử dụng trong Python: Các tác giả gọi cơ chế gọi theo giá trị và những người gọi nó là tham chiếu theo từng cuộc gọi đang kéo dài các định nghĩa cho đến khi chúng phù hợp.

Nói một cách chính xác, Python sử dụng một cơ chế, được gọi là "từng đối tượng", đôi khi còn được gọi là "cuộc gọi bằng tham chiếu đối tượng" hoặc "cuộc gọi bằng cách chia sẻ".

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Nếu bạn vượt qua các đối số bất biến như số nguyên, chuỗi hoặc bộ dữ liệu cho một hàm, các hành vi vượt qua như giá trị gọi. Tham chiếu đối tượng được chuyển đến các tham số chức năng. Chúng không thể được thay đổi trong chức năng, vì chúng không thể thay đổi, tức là chúng là bất biến. Nó khác, nếu chúng ta vượt qua các lập luận có thể thay đổi. Chúng cũng được thông qua bởi tham chiếu đối tượng, nhưng chúng có thể được thay đổi tại chỗ trong hàm. Nếu chúng tôi chuyển một danh sách cho một hàm, chúng tôi phải xem xét hai trường hợp: các yếu tố của danh sách có thể được thay đổi tại chỗ, tức là danh sách sẽ được thay đổi ngay cả trong phạm vi của người gọi. Nếu một danh sách mới được gán cho tên, danh sách cũ sẽ không bị ảnh hưởng, tức là danh sách trong phạm vi của người gọi sẽ không bị ảnh hưởng.

Đầu tiên, chúng ta hãy xem các biến số nguyên dưới đây. Tham số bên trong hàm vẫn là một tham chiếu đến biến của đối số, miễn là tham số không được thay đổi. Ngay khi một giá trị mới được gán cho nó, Python tạo ra một biến cục bộ riêng biệt. Biến của người gọi sẽ không được thay đổi theo cách này:

def ref_demo(x):
    print("x=",x," id=",id(x))
    x=42
    print("x=",x," id=",id(x))

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Trong ví dụ trên, chúng tôi đã sử dụng hàm id (), lấy một đối tượng làm tham số. id (obj) trả về "danh tính" của đối tượng "obj". Danh tính này, giá trị trả về của hàm, là một số nguyên là duy nhất và không đổi cho đối tượng này trong suốt vòng đời của nó. Hai đối tượng khác nhau có thời gian sống không chồng chéo có thể có cùng giá trị id ().

Nếu bạn gọi hàm ref_demo () của ví dụ trước - giống như chúng ta làm trong khối màu xanh lá cây bên dưới - chúng ta có thể kiểm tra điều gì xảy ra với chức năng id (): chúng ta có thể thấy rằng trong phạm vi chính, x có danh tính 140709692940944. Trong câu lệnh in đầu tiên của hàm ref_demo (), X từ phạm vi chính được sử dụng, bởi vì chúng ta có thể thấy rằng chúng ta có cùng một danh tính. Sau khi chúng tôi gán giá trị 42 cho X, X sẽ nhận được danh tính mới 140709692942000, tức là một vị trí bộ nhớ riêng biệt từ toàn cầu X. Vì vậy, khi chúng ta trở lại trong phạm vi chính X vẫn còn giá trị ban đầu 9 và ID 140709692940944.

Nói cách khác, Python ban đầu hoạt động giống như tham chiếu theo từng cuộc gọi, nhưng ngay khi chúng tôi thay đổi giá trị của một biến đó, tức là ngay khi chúng tôi gán một đối tượng mới cho nó, Python "chuyển" để gọi theo giá trị. Đó là, một biến cục bộ X sẽ được tạo và giá trị của biến toàn cầu X sẽ được sao chép vào nó.

OUTPUT:

OUTPUT:

x= 9  id= 140709692940944
x= 42  id= 140709692942000

OUTPUT:

Phản ứng phụ

Một chức năng được cho là có tác dụng phụ, nếu, ngoài việc tạo ra giá trị trả lại, nó sửa đổi môi trường của người gọi theo những cách khác. Ví dụ: một hàm có thể sửa đổi một biến toàn cầu hoặc tĩnh, sửa đổi một trong các đối số của nó, nêu ra một ngoại lệ, ghi dữ liệu vào một màn hình hoặc tệp, v.v.

Có những tình huống, trong đó các tác dụng phụ này được dự định, tức là chúng là một phần của đặc điểm kỹ thuật của chức năng. Nhưng trong các trường hợp khác, chúng không bị truy nã, chúng là tác dụng phụ ẩn. Trong chương này, chúng tôi chỉ quan tâm đến các tác dụng phụ thay đổi một hoặc nhiều biến toàn cầu, đã được truyền dưới dạng đối số cho một hàm. Giả sử, chúng ta đang chuyển một danh sách cho một chức năng. Chúng tôi hy vọng chức năng không thay đổi danh sách này. Đầu tiên, chúng ta hãy xem một chức năng không có tác dụng phụ. Vì một danh sách mới được gán cho danh sách tham số trong func1 (), một vị trí bộ nhớ mới được tạo cho danh sách và danh sách trở thành một biến cục bộ.

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)

OUTPUT:

['London', 'Leeds', 'Glasgow', 'Sheffield']
['London', 'Leeds', 'Glasgow', 'Sheffield', 'Birmingham', 'Bradford']

OUTPUT:

['London', 'Leeds', 'Glasgow', 'Sheffield']

Điều này thay đổi mạnh mẽ, nếu chúng tôi tăng danh sách bằng cách sử dụng toán tử gán tăng cường +=. Để hiển thị điều này, chúng tôi thay đổi hàm trước đó đổi tên nó thành "side_effects" trong ví dụ sau:

def side_effects(cities):
    print(cities)
    cities += ["Birmingham", "Bradford"]
    print(cities)
 
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
side_effects(locations)

OUTPUT:

['London', 'Leeds', 'Glasgow', 'Sheffield']
['London', 'Leeds', 'Glasgow', 'Sheffield', 'Birmingham', 'Bradford']

OUTPUT:

['London', 'Leeds', 'Glasgow', 'Sheffield', 'Birmingham', 'Bradford']

Chúng ta có thể thấy rằng Birmingham và Bradford cũng được đưa vào các địa điểm danh sách toàn cầu, bởi vì += hoạt động như một hoạt động tại chỗ.

Người dùng của chức năng này có thể ngăn chặn tác dụng phụ này bằng cách chuyển một bản sao cho chức năng. Một bản sao nông là đủ, bởi vì không có cấu trúc lồng nhau trong danh sách. Để thỏa mãn khách hàng Pháp của chúng tôi, chúng tôi thay đổi tên thành phố trong ví dụ tiếp theo để chứng minh ảnh hưởng của toán tử lát cắt trong cuộc gọi chức năng:

def side_effects(cities):
    print(cities)
    cities += ["Paris", "Marseille"]
    print(cities)
 
locations = ["Lyon", "Toulouse", "Nice", "Nantes", "Strasbourg"]
side_effects(locations[:])
print(locations) 

OUTPUT:

['Lyon', 'Toulouse', 'Nice', 'Nantes', 'Strasbourg']
['Lyon', 'Toulouse', 'Nice', 'Nantes', 'Strasbourg', 'Paris', 'Marseille']
['Lyon', 'Toulouse', 'Nice', 'Nantes', 'Strasbourg']

OUTPUT:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
0

Chúng ta có thể thấy rằng các vị trí danh sách toàn cầu đã không được thực hiện bằng cách thực hiện chức năng.

Đào tạo Python sống

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Đối số dòng lệnh

Nếu bạn sử dụng giao diện dòng lệnh, tức là giao diện người dùng văn bản (TUI) và không phải giao diện người dùng đồ họa (GUI), các đối số dòng lệnh rất hữu ích. Chúng là các đối số được thêm vào sau khi gọi chức năng trong cùng một dòng.

Thật dễ dàng để viết các tập lệnh Python bằng các đối số dòng lệnh. Nếu bạn gọi một tập lệnh Python từ một shell, các đối số sẽ được đặt sau tên tập lệnh. Các đối số được phân tách bằng không gian. Bên trong tập lệnh, các đối số này có thể truy cập thông qua biến danh sách sys.argv. Tên của tập lệnh được bao gồm trong danh sách này sys.argv [0]. sys.argv [1] chứa tham số đầu tiên, sys.argv [2] lần thứ hai và vân vân. Tập lệnh sau (arguments.py) in tất cả các đối số:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
1

Lặp lại tất cả các đối số:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
2

Ví dụ Gọi cho tập lệnh này:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
3

Cuộc gọi này tạo ra đầu ra sau:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
4

Độ dài thay đổi của các tham số

Chúng tôi sẽ giới thiệu các chức năng bây giờ, có thể có một số lượng đối số tùy ý. Những người có một số nền tảng lập trình trong C hoặc C ++ biết điều này từ tính năng varargs của các ngôn ngữ này.

Một số định nghĩa, không thực sự cần thiết cho các điều sau đây: một hàm có số lượng đối số tùy ý thường được gọi là hàm biến đổi trong khoa học máy tính. Để sử dụng một thuật ngữ đặc biệt khác: một hàm variadic là một hàm của arity không xác định. Sự khác biệt của một hàm hoặc hoạt động là số lượng đối số hoặc toán hạng mà hàm hoặc hoạt động thực hiện. Thuật ngữ này có nguồn gốc từ các từ như "unary", "nhị phân", "ternary", tất cả đều kết thúc bằng "ary".

Dấu hoa thị "*" được sử dụng trong Python để xác định một số lượng đối số khác nhau. Ký tự dấu hoa thị phải đi trước một định danh biến trong danh sách tham số.

x= 9  id= 140709692940944
x= 42  id= 140709692942000
5

OUTPUT:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
6

OUTPUT:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
7

Chúng ta tìm hiểu từ ví dụ trước rằng các đối số được truyền đến lệnh gọi hàm của varpafu () được thu thập trong một tuple, có thể được truy cập dưới dạng biến "bình thường" x trong phần thân của hàm. Nếu hàm được gọi mà không có bất kỳ đối số nào, giá trị của X là một bộ gốc trống.

Đôi khi, cần sử dụng các tham số vị trí theo sau là số lượng tham số tùy ý trong định nghĩa hàm. Điều này là có thể, nhưng các tham số vị trí luôn phải đi trước các tham số tùy ý. Trong ví dụ sau, chúng tôi có một tham số vị trí "Thành phố", - vị trí chính, - luôn phải được đưa ra, tiếp theo là một số lượng tùy ý của các vị trí khác:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
8

OUTPUT:

x= 9  id= 140709692940944
x= 42  id= 140709692942000
9

* Trong các cuộc gọi chức năng

A * cũng có thể xuất hiện trong các cuộc gọi chức năng, như chúng ta vừa thấy trong bài tập trước: ngữ nghĩa trong trường hợp này là "nghịch đảo" với một ngôi sao trong một định nghĩa chức năng. Một đối số sẽ được giải nén và không được đóng gói. Nói cách khác, các yếu tố của danh sách hoặc tuple được số ít:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
0

OUTPUT:

Hầu như không cần phải đề cập rằng cách gọi chức năng của chúng tôi thoải mái hơn so với sau:

OUTPUT:

Ngoài ra, cuộc gọi trước đó (F (P [0], P [1], p [2])) không hoạt động trong trường hợp chung, tức là danh sách các độ dài không xác định. "Không xác định" có nghĩa là độ dài chỉ được biết trong thời gian chạy chứ không phải khi chúng ta đang viết kịch bản.

Tham số từ khóa tùy ý

Ngoài ra còn có một cơ chế cho một số lượng các tham số từ khóa tùy ý. Để làm điều này, chúng tôi sử dụng Double Asterisk "**" Ký hiệu:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
1

OUTPUT:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
2

OUTPUT:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
3

Double Asterisk trong các cuộc gọi chức năng

Ví dụ sau đây cho thấy việc sử dụng ** trong một cuộc gọi chức năng:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
4

OUTPUT:

Và bây giờ kết hợp với *:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
5

OUTPUT:

Tập thể dục

Viết một hàm tính toán trung bình số học của một số lượng giá trị biến.

Dung dịch

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
6

Bạn có thể tự hỏi, tại sao chúng tôi sử dụng cả tham số vị trí "X" và tham số biến "l" trong định nghĩa hàm của chúng tôi. Chúng tôi chỉ có thể sử dụng L để chứa tất cả các số của chúng tôi. Chúng tôi muốn thực thi rằng chúng tôi luôn có một danh sách các số không phải trống. Điều này là cần thiết để ngăn chặn một bộ phận theo lỗi bằng không, vì mức trung bình của một danh sách số trống không được xác định.

Trong phiên Python tương tác sau đây, chúng ta có thể tìm hiểu cách sử dụng chức năng này. Chúng tôi giả sử rằng hàm arithmetic_mean được lưu trong một tệp gọi là thống kê.py.

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
7

Điều này hoạt động tốt, nhưng có một cái bắt. Điều gì sẽ xảy ra nếu ai đó muốn gọi hàm với một danh sách, thay vì một số số khác nhau, như chúng ta đã hiển thị ở trên? Chúng ta có thể thấy sau đây rằng chúng ta nêu ra một lỗi, như hầu hết hy vọng, bạn có thể mong đợi:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
8

OUTPUT:

def no_side_effects(cities):
    print(cities)
    cities = cities + ["Birmingham", "Bradford"]
    print(cities)
locations = ["London", "Leeds", "Glasgow", "Sheffield"]
no_side_effects(locations)
9

Giải cứu đang sử dụng dấu hoa thị khác:

['London', 'Leeds', 'Glasgow', 'Sheffield']
['London', 'Leeds', 'Glasgow', 'Sheffield', 'Birmingham', 'Bradford']
0

Đào tạo Python sống

Hướng dẫn how do arguments work in python? - các đối số hoạt động như thế nào trong python?

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Làm thế nào để bạn sử dụng các đối số trong Python?

Thông tin có thể được truyền vào các chức năng như đối số.Đối số được chỉ định sau tên hàm, bên trong dấu ngoặc đơn.Bạn có thể thêm nhiều đối số như bạn muốn, chỉ cần tách chúng bằng dấu phẩy.Arguments are specified after the function name, inside the parentheses. You can add as many arguments as you want, just separate them with a comma.

4 loại đối số trong Python là gì?

Trong Python, chúng ta có 4 loại đối số chức năng sau ...
Đối số mặc định ..
Đối số từ khóa (đối số được đặt tên).
Đối số vị trí ..
Các đối số tùy ý (đối số có độ dài thay đổi *args và ** kwargs).

Làm thế nào để một đối số chức năng hoạt động?

Các đối số được truyền theo giá trị Các tham số, trong một cuộc gọi hàm, là các đối số của hàm.Các đối số JavaScript được truyền theo giá trị: Hàm chỉ được biết các giá trị, chứ không phải vị trí của đối số.Nếu một hàm thay đổi giá trị của đối số, nó sẽ không thay đổi giá trị ban đầu của tham số. The parameters, in a function call, are the function's arguments. JavaScript arguments are passed by value: The function only gets to know the values, not the argument's locations. If a function changes an argument's value, it does not change the parameter's original value.

3 loại đối số trong Python là gì?

Do đó, chúng tôi kết luận rằng các đối số chức năng Python và ba loại đối số của nó cho các chức năng.Đây là những đối số mặc định, từ khóa và tùy ý.default, keyword, and arbitrary arguments.