Đối số vị trí so với đối số từ khóa


81

Dựa trên cái này

Đối số vị trí là tên không được theo sau bởi dấu bằng (=) và giá trị mặc định.

Theo sau một đối số từ khóa là một dấu bằng và một biểu thức cung cấp giá trị mặc định của nó.

def rectangleArea(width, height):
    return width * height

print rectangleArea(width=1, height=2)

Câu hỏi > Tôi giả sử rằng cả hai widthheightđều là đối số vị trí. Vậy tại sao chúng ta cũng có thể gọi nó bằng cú pháp đối số từ khóa?


1
"tại sao chúng ta cũng có thể gọi nó bằng cú pháp đối số thực từ khóa?" Bởi vì đó là cách thức hoạt động của ngôn ngữ.
S.Lott

Câu trả lời:


152

Văn bản mà bạn trích dẫn là dành cho định nghĩa của hàm và không liên quan gì đến các lệnh gọi đến hàm. Trong lệnh gọi hàm đó, bạn đang sử dụng tính năng "đối số được đặt tên". Liên kết mà bạn cung cấp không phải là một liên kết có chất lượng tốt, các tác giả có vẻ nhầm lẫn giữa hai thứ khác nhau.

Tham chiếu Python đề cập đến các đối số vị trí và từ khóa liên quan đến lệnh gọi hàm (xem phần5.3.4 Calls ).

Khi họ nói về định nghĩa của một hàm trong phần7.6 Function definitions , đó là một thuật ngữ hoàn toàn khác "giá trị tham số mặc định".

Tôi nghi ngờ những người tập hợp khóa học đó không hoàn toàn quen thuộc với Python :-)


Ví dụ, hãy tham khảo định nghĩa và cách gọi sau:

def fn (a, b, c = 1):          # a/b required, c optional.
    return a * b + c

print fn (1, 2)                # returns 3, positional and default.
print fn (1, 2, 3)             # returns 5, positional.
print fn (c = 5, b = 2, a = 2) # returns 9, named.
print fn (b = 2, a = 2)        # returns 5, named and default.
print fn (5, c = 2, b = 1)     # returns 7, positional and named.
print fn (8, b = 0)            # returns 1, positional, named and default.

Ý nghĩa của những =thay đổi, tùy thuộc vào việc nó nằm trong định nghĩa hay trong cách gọi.

Trong định nghĩa, nó đánh dấu đối số là tùy chọn và đặt giá trị mặc định.

Trong lệnh gọi, nó chỉ cho phép bạn chỉ định đối số nào nên là giá trị nào, theo bất kỳ thứ tự nào bạn muốn.


35

Vì python 3.8 chỉ giới thiệu các đối số vị trí, bài đăng này cần được cập nhật.

Đối số vị trí, đối số từ khóa, đối số bắt buộc và đối số tùy chọn thường bị nhầm lẫn. Đối số vị trí KHÔNG PHẢI LÀ đối số bắt buộc. và các đối số từ khóa KHÔNG PHẢI LÀ đối số tùy chọn.

Đối số vị trí là các đối số có thể được gọi theo vị trí của chúng trong định nghĩa hàm.

Đối số từ khóa là đối số có thể được gọi bằng tên của chúng.

Các đối số bắt buộc là các đối số phải được truyền cho hàm.

Đối số tùy chọn là đối số không thể được truyền cho hàm. Trong Python, các đối số tùy chọn là các đối số có giá trị mặc định .

Đối số vị trí là tùy chọn (python 3.8)

def f(a=2, /):
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Đối số vị trí là bắt buộc (python 3.8)

def f(a, /):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

Đối số từ khóa là tùy chọn

def f(*, a=1):
    pass


f()  # Allowed
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

đối số từ khóa là bắt buộc

def f(*, a)
    pass


f()  # Error, argument required
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

Đối số vị trí và từ khóa là tùy chọn

def f(a=1)
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a=1, /):
    pass

Đối số vị trí và từ khóa là bắt buộc

def f(a):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a, /):
    pass

Kết luận, một đối số có thể là tùy chọn hoặc bắt buộc không đồng thời cả hai . Nó cũng có thể là vị trí, từ khóa hoặc cả hai cùng một lúc .

Python 3.8 đã giới thiệu các tham số chỉ vị trí .

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass

Ý của bạn là f(/,a,*)thay vì f(*, a, /)trong hai ví dụ cuối cùng của bạn?
Jagerber48,

21

Đối số từ khóa chỉ là đối số vị trí với giá trị mặc định. Bạn phải chỉ định tất cả các đối số không có giá trị mặc định. Nói cách khác, các đối số từ khóa chỉ là "tùy chọn" vì chúng sẽ được đặt thành giá trị mặc định nếu không được cung cấp cụ thể.


Được rồi, điều đó có lý, nhưng bạn có thể giải thích thêm về lý do tại sao nó được gọi là đối số "từ khóa" không? Tôi biết đối số "vị trí" có nghĩa là vị trí của chúng quan trọng khi bạn gọi hàm.
NoName

3

Các đối số vị trí có thể được gọi bằng cách sử dụng các giá trị theo thứ tự hoặc bằng cách đặt tên cho từng đối số. Ví dụ: cả ba điều sau sẽ hoạt động theo cùng một cách:

def rectangleArea(width, height):
    return width * height

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))

Tôi không nghĩ rằng điều này là chính xác. Theo bảng thuật ngữ chính thức của Python ở đây , đối số vị trí là đối số không phải là đối số từ khóa. Định nghĩa của đối số từ khóa là đối số được đặt trước bởi một mã định danh (ví dụ name=) trong một lệnh gọi hàm hoặc được chuyển dưới dạng giá trị trong từ điển đứng trước **. Hai định nghĩa này mâu thuẫn với ví dụ của bạn.
Rafael

1

đối số vị trí: đối số được truyền cho một hàm theo đúng thứ tự vị trí. chương trình dưới đây hiểu các đối số vị trí của một hàm

#positional arguments example
def combine(str1, str2):
#To join str1 and str2 with str3
    str3 = str1 + str2
    print(str3)

#call combine() and pass 2 strings
combine("Well", "come")   #positional arguments 

giả sử, chúng tôi vượt qua 'đến' đầu tiên, 'tốt' thứ hai, sau đó kết quả sẽ là tốt. ngoài ra, gọi hàm 3 chuỗi trở thành lỗi.


0

Hiểu các đối số từ khóa của một hàm.

Đối số từ khóa là đối số xác định các tham số theo tên của chúng.

#keyword arguments example: 
def employee(name, Id):
    print("Employee Name: ", name)
    print("Employee Id  : ", Id)
#call employee() and pass 2 arguments
employee(name = "inban", Id = "pay001")
employee(Id = "pay002", name = "karthik") #we can change the order args.

0

Việc xác định các tham số và đối số ở đây có thể hữu ích.

  1. Tham số: một thực thể được đặt tên trong định nghĩa hàm / phương thức chỉ định một đối số.
  2. Đối số: một giá trị được truyền cho một hàm.

Ví dụ,

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

Bây giờ khi bạn nói đối số vị trí, bạn đang nói về các đối số , vì vậy không liên quan gì đến định nghĩa hàm. widthheighttrong ví dụ của bạn là tham số vị trí hoặc tham số từ khóa (được gọi là tham số vị trí hoặc từ khóa).

Cách bạn đang gọi / truyền giá trị cho hàm sẽ xác định xem chúng là đối số vị trí hay đối số từ khóa .

rectangleArea(1, 2) # positional arguments
rectangleArea(width=1, height=2) # keyword arguments

Điều mà không nhiều người biết là bạn có thể chỉ định một tham số chỉ vị trí bằng cách sử dụng /trong danh sách tham số (ví dụ từ đây ).

def func(positional_only1, positional_only2, /, positional_or_keyword): ...

Tương tự, bạn cũng có thể có các tham số chỉ từ khóa bằng cách sử dụng *ký tự.

def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...

Cuối cùng, chúng ta cũng có var-positional và var-keyword (hay còn gọi là * args và ** kwargs tương ứng). Có nghĩa là, bạn có thể có một chuỗi đối số vị trí hoặc đối số từ khóa tùy ý được truyền vào hàm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.