Đối số biến trong python

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à hàm có thể, 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, bạn 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 tham 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 tham số được sử dụng trong cuộc gọi thủ tục, tức là 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"

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"

  • Calling THE chiến lược giá trị phổ biến nhất là đánh giá theo từng giá trị, đôi khi còn được gọi là đánh giá qua. Chiến lược này được sử dụng trong C và C++ không có giới hạn. Trong cuộc 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 các tham số tương ứng. Điều này chắc chắn rằng các 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ó tham chiếu đến các đối số, thay vì bản sao giá trị của nó. Do đó, function may be change argument, tức là giá trị của biến trong phạm vi của người gọi có thể bị 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 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 bao gồm bất chấp 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, chẳng hạn 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 đượ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 Trăn thì sao?

Hướng dẫn how do you pass an argument variable in python? - làm thế nào để bạn truyền một biến đối số trong python?

Có một số cuốn sách gọi chiến lược của Python Call-by-value, 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á bất kỳ đượ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 cuộc gọi đang kéo dài từng đị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à "ngừ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 you pass an argument variable in python? - làm thế nào để bạn truyền một biến đối số 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, thì các hành vi vượt qua như giá trị gọi. Tham chiếu các đối tượng được chuyển đến các tham số chức năng. Chúng không thể 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 thì có thể thay đổi các cấp độ. Chúng cũng được thông qua bởi các đối tượng tham chiếu, nhưng chúng có thể được thay đổi tại chỗ trong hàm. Nếu 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à tham chiếu đến biến của đối số, miễn phí là tham số không bị 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. Sự biến đổi 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 you pass an argument variable in python? - làm thế nào để bạn truyền một biến đối số 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) return "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 thay đổi đố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 xem đ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 đầ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 quay 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 đổi" . Đó 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ó

ĐẦU RA

ĐẦU RA

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

ĐẦU RA

Phản hồi 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ó 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 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 vấn đề, trong đó các tác dụng phụ này được dự kiến, 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 trình này, chúng tôi chỉ quan tâm đến việc 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. We 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 bộ 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

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

ĐẦU RA

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

Điều này thay đổi cường độ, nếu chúng tôi tăng danh sách bằng cách sử dụng toán tử chỉ định tăng cường +=. Để hiển thị điều này, chúng tôi đã thay đổi hàm trước đó đổi tên của 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)

ĐẦU RA

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

ĐẦU RA

['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 sử dụng 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. Để chào đó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 thanh toán tử cắt trong cuộc gọi chức năng

________số 8

ĐẦU RA

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

ĐẦU RA

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

Dao create Python live

Hướng dẫn how do you pass an argument variable in python? - làm thế nào để bạn truyền một biến đối số trong python?

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

Ghi danh ở đây

Argument line command

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), thì 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 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ừ 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 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 hệ thống. argv. Tên của lệnh tập tin đượ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] lần thứ hai và vân vân. command after (arguments. py) trong 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ụ Call to this file

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

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

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

Thay đổi độ dà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ừ các varargs tính năng 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 chọn 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 chức năng hoặc hoạt động là số lượng đối số hoặc thứ hạng toán học mà chức năng 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ự hoa thị phải đi trước một biến định danh trong danh sách tham số

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

ĐẦU RA

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

ĐẦU RA

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 bộ, 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

Double when, need to use the số lượng vị trí theo sau là số lượng tham số tùy chọn 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 chọn. 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 chọn của các vị trí khác

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

ĐẦU RA

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 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 chức năng định nghĩa. Một số đố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 đánh 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

ĐẦU RA

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 thoải mái hơn so với sau

ĐẦU RA

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 thời là danh sách độ 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 chọn

Ngoài ra còn có một cơ chế cho một số lượng tham số từ khóa tùy chọn. Để thực hiện điều này, chúng tôi sử dụng Dấu hoa thị kép "**" 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

ĐẦU RA

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

ĐẦU RA

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 chức năng cuộc gọi

Ví dụ sau đây để 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

ĐẦU RA

And now connect with *

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

ĐẦU RA

Expansionable

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 hiện 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 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 bả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 số học có nghĩa là đượ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ố khác nhau, như chúng ta đã hiển thị ở trên?