Kiểu dữ liệu Function trong Python - Positional và keyword argument

Lập trình Python cơ bản

5.0 (6 đánh giá)
Tạo bởi I Hate Python Team Cập nhật lần cuối 23:39 29-11-2021 59.417 lượt xem 9 bình luận
Học nhanh

Danh sách bài học

Kiểu dữ liệu Function trong Python - Positional và keyword argument

Dẫn nhập

Trong bài trước, Kteam đã giới thiệu đến bạn KIỂU DỮ LIỆU FUNCTION TRONG PYTHON.

Và ở bài này Kteam sẽ lại tìm hiểu với các bạn KIỂU DỮ LIỆU FUNTION TRONG PYTHON – Positional và keyword argument.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Positional argument và keyword argument
  • Bắt buộc (force) positional argument và keyword argument

Positional argument và keyword argument

Với một hàm thông thường như sau

>>> def kteam(a, b):
...     pass # lệnh giữ chỗ.
...

Thì ta có thể pass argument vào cho hàm như sau

>>> kteam(3, 'Free Education')

Trong ví dụ trên, hai giá trị là số 3 và chuỗi ‘Free Education’ gọi là positional argument.

Còn với trường hợp dưới đây

>>> kteam(a=3, b='Free Education')

Thì hai giá trị trên (chính là số 3 và chuỗi ‘Free Education’) là những keyword argument.

Sau đây là những điều tuy nhỏ nhưng bạn cần phải biết. Khi pass argument theo positional argument. Thì các argument sẽ được gán LẦN LƯỢT cho các parameter. Riêng đối với keyword argument. Bạn đã tự mình gán giá trị cho các parameter. Vậy nên:

>>> def kteam(a, b):
...     print('a', a)
...     print('b', b)
...
>>> kteam(a=3,b=4)
a 3
b 4
>>> kteam(b=3,a=4)
a 4
b 3

Hai cách gọi hàm trên đều tương tự như nhau.

Một điều nữa là bạn không được phép để positional theo sau (follow) keyword.

Có nghĩa là bạn có thể pass argument vừa positional keyword cùng một lúc được, nhưng những positional buộc phải đứng trước keyword.

Trường hợp ngớ ngẩn của Tèo sau đây sẽ cho bạn biết điều đó:

>>> def teo_with_sone(name, verb):
...     print('Teo', verb + 's', name)
...
>>> teo_with_sone('Python', 'love')
Teo loves Python
>>> teo_with_sone('HTML', verb='like')
Teo likes HTML
>>> teo_with_sone(verb='like', 'CSharp')
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> teo_with_sone(name='Java', 'hate')
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

Bắt buộc (force) Positional argument và keyword argument

Keyword argument

Trong Python, có một số hàm bắt chúng ta buộc phải pass argument một cách rõ ràng rành mạch như hàm sorted.

>>> sorted([3, 4, 1], reverse=True)
[4, 3, 1]

>>> sorted([3, 4, 1], True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must use keyword argument for key function

Bạn thấy đấy, ta không thể pass argument cho parameter reverse theo positional argument.

Việc thiết kế này cũng rất tiện lợi vì nhiều trường hợp nhiều parameter cùng một lúc đều có default argument value. Hãy xem vấn đề sau đây mà Tèo mắc phải.

Tèo có một hàm

>>> def Teo(a, b=2, c=3, d=4):
...     f = (a + d) * (b + c)
...     print(f)
...
>>> Teo(1)
25
>>> Teo(1, 2, 3, 5)
30

Tèo gọi hàm thì thấy kết quả theo đúng ý mình. Giờ Tèo muốn đổi giá trị của parameter d thành 5. Nên Tèo phải truyền lại các giá trị 23 cho các parameter bc.

Vậy, ta có cách nào không phải truyền lại hai giá trị cho parameter b và c không?

Có, chính là keyword argument.

>>> Teo(1, d=5)
30

Đôi lúc, chúng ta nên sử dụng keyword argument để tiện lợi và rõ ràng.

Python cho phép chúng ta tạo ra các parameter chỉ nhận giá  trị bằng việc pass argument theo kiểu keyword argument.

Cú pháp

def function (*, key_arg1, key_arg2):

# function-block

Khi tạo một hàm mà có một parameter *. Thì Python sẽ hiểu đó không phải là parameter mà chính là syntax để rồi nó biến các parameter sau * thành các keyword only argument (chỉ nhận giá trị theo kiểu keyword argument)

Ví dụ là dễ hiểu nhất!

>>> def kteam(pos_or_key_arg, *, key_arg1, key_arg2):
...     print(pos_or_key_arg)
...     print(key_arg1)
...     print(key_arg2)
...

>>> kteam(1, key_arg1=2, key_arg2='Kteam')
1
2
Kteam
>>> kteam(1, 2, key_arg2='Kteam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: kteam() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given

>>> kteam(1, 2, 'Kteam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: kteam() takes 1 positional argument but 3 were given

Lưu ý: ta có thể thay thế dấu * bằng *identifier. Tuy nhiên phổ biến vẫn là *.


Positional argument

Bạn còn nhớ hàm input chứ? Kteam từng nói với bạn rằng cú pháp của hàm input có thể được viết như thế này.

input(prompt=None, /)

Dấu / chính là một syntax để force parameter prompt trở thành positional only argument. Có nghĩa là bạn chỉ có thể pass argument cho parameter prompt theo kiểu positional. Chính xác thì dấu / sẽ biến các parameter đứng trước nó thành positional only argument

Tuy nhiên Kteam sẽ không đi sâu vào positional argument vì ở phiên bản Python 3.6.X trở đi không hỗ trợ positional only argument.

Lưu ý: 3.6.X trở đi không hỗ trợ không có nghĩa những bạn cũ hơn một chút xíu như 3.5, 3.4 có hỗ trợ.

Cập nhập mới: (Đã được hỗ trợ trở lại từ Py 3.8)


Củng cố bài học

Câu hỏi củng cố

Câu hỏi: Dùng hàm help để xem cú pháp của hàm sorted? Sau đó cho biết parameter nào là positional only? Parameter nào là keyword only?

Đáp án của phần này sẽ được trình bày ở bài tiếp theo. Tuy nhiên, Kteam khuyến khích bạn tự trả lời các câu hỏi để củng cố kiến thức cũng như thực hành một cách tốt nhất! 


Kết luận

Qua bài viết này, Bạn đã biết một chút về hàm trong Python qua các khái niệm positional argument và keyword argument.

Ở bài viết sau. Kteam sẽ tiếp tục giới thiệu thêm với các bạn về HÀM TRONG PYTHON (FUNCTION).

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Kiểu dữ liệu Function trong Python - Positional và keyword argument dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Quan tâm lập trình và lịch sử.

Thích tìm hiểu công nghệ mới




Chúng tôi là những người có niềm yêu thích Python và muốn Python được nhiều người biết đến hơn ở Việt Nam.

Khóa học

Lập trình Python cơ bản

Lập trình Python cơ bản

Đánh giá

hieunxhe191630 đã đánh giá 13:26 13-08-2024

NHAT DOI đã đánh giá 20:25 19-05-2022

very good

PAPAYAGA đã đánh giá 14:59 05-11-2021

nibbasnazi đã đánh giá 16:29 22-04-2020

Nhàn đã đánh giá 14:46 08-01-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
xiloxila đã bình luận 16:00 13-10-2023
help(sorted)
Iterable là position only và key = None, reverse = False là keyword only
symon6576 đã bình luận 15:44 22-07-2023

help(sorted)
iterable: positional argument

key, reverse: keyword argument

Hang Tran đã bình luận 09:21 23-06-2023

help(sorted)

Help on built-in function sorted in module builtins:
sorted(iterable, /, *, key=None, reverse=False)
iterable: positional argument 
key, reverse: key argument

mikewang đã bình luận 01:29 10-01-2023

sorted(iterable, /, *, key=None, reverse=False)

positional là iterable

keyword only là key=None, reverse=False

NhuwLikesVeggies đã bình luận 08:54 17-06-2022

sorted(iterable, /, *, key=None, reverse=False)

ierable: positional only argument

key, reverse: keyword only argument

Không có video.