Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

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ừ đó chức năng đã được gọi, và chức năng, i. e. thân 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 về cách các tham số được khai báo và ngữ nghĩa về cách các đối số được truyền cho các tham số của hàm hoặc thủ tục tùy 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ố nằm bên trong các hàm hoặc thủ tục, trong khi các đối số được sử dụng trong các lời gọi thủ tục, i. e. các giá trị được truyền cho hàm trong thời gian chạy

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

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Chiến lược đánh giá cho lập luận, tôi. e. cách các đối số từ lời gọi hàm được chuyể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à "gọi theo giá trị" và "gọi theo tham chiếu"

  • Gọi theo giá trị Chiến lược phổ biến nhất là đánh giá theo giá trị gọi, đôi khi còn được gọi là chuyển theo giá trị. Chiến lược này được sử dụng trong C và C++, ví dụ. Trong gọi theo 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 theo tham chiếu Trong đánh giá theo tham chiếu, còn được gọi là truyền theo tham chiếu, một hàm nhận tham chiếu ẩn tới đối số, thay vì bản sao giá trị của nó. Kết quả là, hàm có thể sửa đổi đối số, tôi. e. 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 Gọi theo tham chiếu, chúng tôi tiết kiệm cả thời gian tính toán và dung lượng bộ nhớ vì không cần phải sao chép các đối số. Mặt khác, điều này có nhược điểm là các biến có thể bị "vô tình" thay đổi trong một lệnh gọi hàm. Vì vậy, phải đặc biệt cẩn thận để "bảo vệ" các giá trị không nên thay đổi. Nhiều ngôn ngữ lập trình hỗ trợ gọi theo tham chiếu, 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à gọi theo tên, không còn được sử dụng trong các ngôn ngữ hiện đại

Đào tạo Python trực tiếp

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

còn Python thì sao?

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

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

Humpty Dumpty đưa ra lời giải thích

--- "Khi tôi dùng một từ," Humpty Dumpty nói, với giọng khá khinh bỉ, "nó chỉ có nghĩa theo ý tôi muốn - không hơn không kém. "

--- "Câu hỏi đặt ra là," Alice nói, "liệu bạn có thể làm cho các từ có nhiều nghĩa khác nhau hay không. "

--- "Vấn đề là," Humpty Dumpty nói, "thế nào là chủ - chỉ vậy thôi. "

Lewis Carroll, Qua gương soi

Để 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ó gọi theo tham chiếu đ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à "Gọi theo đối tượng", đôi khi còn được gọi là "Gọi theo tham chiếu đối tượng" hoặc "Gọi theo chia sẻ"

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Nếu bạn truyền các đối số không thay đổi như số nguyên, chuỗi hoặc bộ dữ liệu cho một hàm, thì việc truyền đó hoạt động như gọi theo giá trị. Tham chiếu đối tượng được chuyển đến các tham số chức năng. Không thể thay đổi chúng trong chức năng, bởi vì chúng không thể thay đổi được, tôi. e. chúng là bất biến. Nó khác, nếu chúng ta truyền các đối số có thể thay đổi. Chúng cũng được truyền theo 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 ta chuyển một danh sách cho một hàm, chúng ta phải xem xét hai trường hợp. Các phần tử của một danh sách có thể được thay đổi tại chỗ, tôi. e. 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, i. e. 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 bên dưới. Tham số bên trong hàm vẫn là tham chiếu đến biến của đối số, miễn là tham số không bị thay đổi. Ngay khi một giá trị mới được gán cho nó, Python sẽ tạo một biến cục bộ riêng. Biến của người gọi sẽ không bị 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))

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

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 duy nhất và không đổi cho đối tượng này trong suốt thời gian tồn tại của nó. Hai đối tượng khác nhau có thời gian tồn tại 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 bên dưới - chúng ta có thể kiểm tra điều gì xảy ra với x bằng hàm 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 nhận được một danh tính mới 140709692942000, tôi. e. một vị trí bộ nhớ riêng biệt từ toàn cầu x. Vì vậy, khi chúng tôi quay lại phạm vi chính x vẫn có giá trị ban đầu là 9 và id 140709692940944

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

x = 9
id(x)

ĐẦU RA

140709692940944

ref_demo(x)

ĐẦU RA

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

id(x)

ĐẦU RA

140709692940944

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ả về, nó cò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 biến toàn cục hoặc biến tĩnh, sửa đổi một trong các đối số của nó, đưa ra một ngoại lệ, ghi dữ liệu vào màn hình hoặc tệp, v.v.

Có những tình huống, trong đó những tác dụng phụ này được dự định, tôi. e. chúng là một phần của đặc tả chức năng. Nhưng trong những trường hợp khác, chúng không được mong muốn, chúng là những tác dụng phụ tiềm ẩn. Trong chương này, chúng ta chỉ quan tâm đến các tác dụng phụ làm thay đổi một hoặc nhiều biến toàn cục đã đượ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 tới một hàm. 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 xét một chức năng không có tác dụng phụ. Khi 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)

ĐẦU RA

________số 8

print(locations)

ĐẦU RA

x = 9
id(x)
0

Điều này sẽ thay đổi đáng kể, nếu chúng ta 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 tên hàm trước đó thành "side_effects" trong ví dụ sau

x = 9
id(x)
1

ĐẦU RA

________số 8

print(locations)

ĐẦU RA

x = 9
id(x)
4

Chúng ta có thể thấy rằng Birmingham và Bradford cũng được bao gồm trong các vị trí trong 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 chức năng này có thể ngă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à đủ, vì không có cấu trúc lồng nhau trong danh sách. Để làm hài lòng các 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 tác dụng của toán tử slice trong lệnh gọi hàm

x = 9
id(x)
5

ĐẦU RA

x = 9
id(x)
6

print(locations)

ĐẦU RA

x = 9
id(x)
8

Chúng ta có thể thấy rằng các vị trí danh sách toàn cầu không bị ảnh hưởng bởi việc thực thi chức năng

Đào tạo Python trực tiếp

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

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

Khái niệm cơ bản về Python cho người mới bắt đầu

Khóa học nâng cao chuyên sâu

Python dành cho kỹ sư và nhà khoa học

Lập trình hướng đối tượng với Python

đăng ký tại đây

Đối số dòng lệnh

Nếu bạn sử dụng giao diện dòng lệnh, tôi. e. giao diện người dùng văn bản (TUI) chứ 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 lệnh gọi hàm 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 tập lệnh Python từ trình bao, 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 dấu cách. Bên trong tập lệnh, các đối số này có thể truy cập được 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]. hệ thống. argv[1] chứa tham số đầu tiên, sys. argv[2] thứ hai, v.v. Đoạn script sau (đối số. py) in tất cả các đối số

x = 9
id(x)
9

Lặp lại trên tất cả các đối số

140709692940944
0

Ví dụ gọi đến tập lệnh này

140709692940944
1

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

140709692940944
2

Đào tạo Python trực tiếp

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

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

Bây giờ chúng tôi sẽ giới thiệu các hàm có thể nhận 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 trường hợp sau. Hàm có số đối số tùy ý thường được gọi là hàm biến thiên trong khoa học máy tính. Để sử dụng một thuật ngữ đặc biệt khác. Một chức năng biến đổi là một chức năng của arity không xác định. Số hạng của một hàm hoặc một phép toán là số đối số hoặc toán hạng mà hàm hoặc phép toán đó nhận. Thuật ngữ này bắt nguồn từ các từ như "đơn nguyên", "nhị phân", "bộ ba", tất cả đều kết thúc bằng "ary"

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

140709692940944
3

ĐẦU RA

140709692940944
4

140709692940944
5

ĐẦU RA

140709692940944
6

Chúng ta học được từ ví dụ trước rằng các đối số được truyền cho lời gọi hàm của varpafu() được thu thập trong một bộ, có thể được truy cập dưới dạng một 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ộ trống

Đôi khi, cần sử dụng các tham số vị trí theo sau là một số 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 đứng trước các tham số tùy ý. Trong ví dụ sau, chúng ta có một tham số vị trí "thành phố", - vị trí chính - luôn phải được cung cấp, theo sau là một số vị trí tùy ý khác

140709692940944
7

ĐẦU RA

140709692940944
8

* trong lời gọi hàm

Dấu * cũng có thể xuất hiện trong lời gọi hàm, 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" thành một ngôi sao trong định nghĩa hàm. 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 phần tử của danh sách hoặc bộ dữ liệu được số ít hóa

140709692940944
9

ĐẦU RA

ref_demo(x)
0

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

ref_demo(x)
1

ĐẦU RA

ref_demo(x)
0

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ôi. e. danh sách 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 tôi viết tập lệnh

Đào tạo Python trực tiếp

Chúng ta có thể chuyển đối tượng làm đối số trong Python không?

Thưởng thức trang này?

Nhìn thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

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

Ngoài ra còn có một cơ chế cho một số tham số từ khóa tùy ý. Để làm điều này, chúng tôi sử dụng ký hiệu dấu hoa thị kép "**"

ref_demo(x)
3

ĐẦU RA

ref_demo(x)
4

ref_demo(x)
5

ĐẦU RA

ref_demo(x)
6

Dấu hoa thị kép trong lời gọi hàm

Ví dụ sau minh họa việc sử dụng ** trong một lệnh gọi hàm

ref_demo(x)
7

ĐẦU RA

ref_demo(x)
8

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

ref_demo(x)
9

ĐẦU RA

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

Tập thể dục

Viết hàm tính trung bình cộng của một số biến có giá trị

Dung dịch

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

Bạn có thể tự hỏi tại sao chúng ta sử dụng cả tham số vị trí "x" và tham số biến "l" trong định nghĩa hàm của mình. 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 trống. Điều này là cần thiết để ngăn lỗi chia cho 0, vì giá trị 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ả định rằng hàm aritmetic_mean được lưu trong một tệp có tên là stats. py

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

Điều này hoạt động tốt, nhưng có một nhược điểm. Điều gì sẽ xảy ra nếu ai đó muốn gọi hàm bằng một danh sách, thay vì một số lượng số thay đổi, như chúng tôi đã trình bày ở trên?

Tôi có thể chuyển đối tượng làm đối số trong Python không?

Một hàm có thể nhận nhiều đối số, các đối số này có thể là đối tượng, biến (cùng hoặc khác kiểu dữ liệu) và hàm .

Bạn có thể chuyển một đối tượng làm đối số không?

Để chuyển một đối tượng làm đối số, chúng ta viết tên đối tượng làm đối số trong khi gọi hàm giống như cách chúng ta thực hiện đối với các biến khác . cú pháp. tên_hàm(tên_đối_tượng); . Trong ví dụ này, có một lớp có biến số nguyên 'a' và hàm 'add' lấy một đối tượng làm đối số.

Chúng ta có thể chuyển các đối tượng làm đối số cho các hàm thành viên không?

Các đối tượng của một lớp có thể được truyền dưới dạng đối số cho các hàm thành viên cũng như các hàm không phải thành viên theo giá trị hoặc theo tham chiếu.

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

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