Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

  80 Lượt xem

Sử dụng hiệu quả Python: Giải thích đầy đủ cho tất cả 71 hàm tích hợp sẵn [P6]

Python

Python là một trong những ngôn ngữ lập trình phổ biến trên toàn thế giới. Một trong những đặc điểm nổi bật của Python là việc nó có một loạt các hàm tích hợp sẵn phong phú.

Tính đến tháng 12 năm 2023, Python có tổng cộng 71 hàm tích hợp sẵn. Tuy nhiên, có bao nhiêu người thực sự biết cách sử dụng chúng hiệu quả?

Trong bài viết này, chúng ta sẽ cung cấp một giải thích chi tiết về cách sử dụng tất cả 71 hàm tích hợp sẵn trong Python, kèm theo ví dụ mã nguồn thực tế. Sau khi đọc bài viết này, bạn sẽ có hiểu biết toàn diện về các hàm tích hợp sẵn của Python từ cơ bản đến nâng cao.

Bắt đầu thôi nào!

Danh sách tất cả hàm tích hợp sẵn

(51) ord()

Trả về mã Unicode của đối số (chuỗi một ký tự) dưới dạng số nguyên.

char = "A"
print(ord(char))  # 65

char = "あ"
print(ord(char))  # 12354
  • Lưu ý: Nếu đối số không phải là chuỗi một ký tự, sẽ gây ra TypeError.
    char = "AB"
    print(ord(char))  # TypeError: ord() expected a character, but string of length 2 found

:::note warn
Nếu bạn không biết về hàm này…
Khi bạn cần lấy mã Unicode của một ký tự, việc viết mã lệnh dài dòng với encode() hoặc int() có thể làm cho mã lệnh trở nên không cần thiết.

char = "A"
print(int.from_bytes(char.encode("utf-8"), "big"))  # 65

Với hàm ord(), bạn có thể viết như sau:

char = "A"
print(ord(char))  # 65

:::

(52) pow()

Trả về kết quả của lũy thừa (số thứ nhất được nhân với bản thân nó số thứ hai lần) với một số dư tùy chọn.

x = 2
y = 3
print(pow(x, y))  # 8

x = 2
y = 3
z = 5
print(pow(x, y, z))  # 3
  • Lưu ý: Nếu số thứ ba được chỉ định, số thứ nhất và số thứ hai phải là số nguyên. Ngược lại, sẽ gây ra TypeError.
x = 2.0
y = 3
z = 5
print(pow(x, y, z))  # TypeError: pow() 3rd argument not allowed unless all arguments are integers

:::note info
Hữu ích khi:
Hàm này hữu ích khi bạn cần tính toán các lũy thừa hoặc phần dư trong quá trình mã hóa, giải mã trong các thuật toán mã hóa khóa công khai như RSA hoặc ElGamal. Hàm pow() có thể tính toán nhanh chóng hơn so với toán tử **, đặc biệt khi bạn làm việc với số lớn.
:::

(53)print()

Hàm print() hiển thị đối số (bất kỳ đối tượng nào) lên đầu ra chuẩn. Bạn có thể chỉ định các ký tự phân tách hoặc ký tự xuống dòng tùy chọn.

print("Hello, world!") # Hello, world!

x = 1
y = 2
print(x, y) # 1 2

x = 1
y = 2
print(x, y, sep=", ") # 1, 2

x = 1
y = 2
print(x, y, end="\n\n") # 1 2
  • Lưu ý
    Nếu không có đối số, nó sẽ xuất một dòng trắng.
print() #

:::note warn
Nếu không biết về hàm này…
Khi hiển thị đối tượng lên đầu ra chuẩn, bạn có thể viết mã lệch lạc bằng cách sử dụng module sys hoặc phương thức str.

import sys
x = 1
y = 2
sys.stdout.write(str(x) + " " + str(y) + "\n") # 1 2

Sử dụng hàm print giúp bạn viết mã ngắn gọn hơn như sau.

x = 1
y = 2
print(x, y) # 1 2

:::

(54)property()

Hàm property() tạo đối tượng thuộc tính từ các hàm getter, setter, deleter và chuỗi tài liệu được đưa ra dưới dạng đối số. Đối tượng thuộc tính có thể xác định cách hoạt động của getter, setter, deleter và tài liệu đối với thuộc tính của lớp.

class Person:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, value):
        self._name = value

    def del_name(self):
        del self._name

    name = property(get_name, set_name, del_name, "name property")

p = Person("Alice")
print(p.name) # Alice
p.name = "Bob"
print(p.name) # Bob
del p.name
print(p.name) # AttributeError: 'Person' object has no attribute '_name'
  • Lưu ý
    Tất cả các đối số đều là tùy chọn, nhưng bạn phải chỉ định ít nhất một trong số hàm getter hoặc setter. Nếu không, nó sẽ gây ra TypeError.
class Person:
    def __init__(self, name):
        self._name = name

    name = property() # TypeError: property expected at least 1 argument, got 0

p = Person("Alice")

:::note warn
Nếu không biết về hàm này…
Nếu cho phép truy cập hoặc thay đổi trực tiếp vào thuộc tính của lớp, có thể gây ra giá trị không hợp lệ hoặc lỗi không mong muốn. Hơn nữa, để lấy hoặc đặt giá trị thuộc tính, bạn phải gọi phương thức mỗi khi. Sử dụng hàm property giúp bạn kiểm soát truy cập thuộc tính và xử lý giá trị như một thuộc tính mà không cần gọi phương thức.
:::

(55) range()

Hàm range() tạo một đối tượng dãy số chứa một chuỗi số nguyên, thường được sử dụng trong vòng lặp.

r = range(10)
print(r)  # range(0, 10)
print(list(r))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

r = range(1, 10, 2)
print(r)  # range(1, 10, 2)
print(list(r))  # [1, 3, 5, 7, 9]
  • Lưu ý:
    • range(start, stop, step) tạo một dãy số từ start đến stop (không bao gồm stop) với bước là step.
r = range(1, 10, 2)
print(r)  # range(1, 10, 2)
print(list(r))  # [1, 3, 5, 7, 9]
  • range() không trả về danh sách mà chỉ tạo một đối tượng range. Để xem dãy số, bạn cần chuyển nó thành danh sách bằng cách sử dụng hàm list().
r = range(10)
print(list(r))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

:::note warn
Nếu không biết về hàm này…
Khi bạn cần tạo một chuỗi số nguyên tuần tự để sử dụng trong vòng lặp, sử dụng range() làm cho mã của bạn trở nên ngắn gọn hơn so với cách thức sử dụng vòng lặp hoặc các phương thức tạo danh sách.

# Sử dụng vòng lặp để tạo danh sách số từ 0 đến 9
numbers = []
for i in range(10):
    numbers.append(i)
print(numbers)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Sử dụng range() như sau:

# Sử dụng range() để tạo danh sách số từ 0 đến 9
numbers = list(range(10))
print(numbers)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

:::

(56) repr()

Hàm repr() chuyển đổi đối tượng được truyền vào (object) thành một chuỗi có thể được phục hồi bởi Python. repr là viết tắt của representation (biểu diễn). Hàm này thường được sử dụng trong quá trình debug và xuất log.

x = [1, 2, 3]
y = "Hello, world!"
z = 3.14
print(repr(x)) # '[1, 2, 3]'
print(repr(y)) # "'Hello, world!'"
print(repr(z)) # '3.14'
  • Lưu ý
    Hàm repr() được định nghĩa để trả về một chuỗi mô tả đối tượng sao cho nếu có thể, chuỗi đó có thể được đánh giá bằng hàm eval() để khôi phục lại đối tượng ban đầu. Hàm eval() thực thi một biểu thức Python từ một chuỗi.
x = [1, 2, 3]
s = repr(x) # '[1, 2, 3]'
x2 = eval(s) # [1, 2, 3]
print(x == x2) # True

Tuy nhiên, hàm repr() không nhất thiết luôn trả về một chuỗi mà hàm eval() có thể khôi phục được. Ví dụ, khi sử dụng repr() với đối tượng của lớp date trong module datetime, chuỗi kết quả không thể được đánh giá bằng eval() như dưới đây.

import datetime
d = datetime.date(2023, 4, 20)
print(repr(d)) # 'datetime.date(2023, 4, 20)'

Chuỗi này sẽ gây lỗi nếu bạn cố gắng thực hiện eval(), vì module datetime chưa được import và tên ‘datetime.date’ không được nhận diện.

s = repr(d) # 'datetime.date(2023, 4, 20)'
d2 = eval(s) # NameError: name 'datetime' is not defined

Do đó, khi sử dụng hàm repr(), quan trọng là kiểm tra xem chuỗi mô tả đối tượng có thể được đánh giá thành đối tượng ban đầu hay không.

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn kiểm tra nội dung hoặc kiểu của một đối tượng, việc chỉ sử dụng hàm str() hoặc hàm print() có thể làm bạn không biết được biểu diễn chính xác của đối tượng. Ví dụ, khi bạn chuyển đổi đối tượng chuỗi thành chuỗi sử dụng hàm str() hoặc hàm print(), dấu ngoặc kép có thể bị lược bỏ.

s = "Hello, world!"
print(str(s)) # Hello, world!
print(s) # Hello, world!

Với cách làm này, không dễ nhận biết được rằng s là một đối tượng chuỗi. Sử dụng hàm repr() sẽ giữ nguyên dấu ngoặc kép, làm cho rõ ràng hơn về đối tượng là một chuỗi.

s = "Hello, world!"
print(repr(s)) # 'Hello, world!'

:::

(57) reversed()

Hàm reversed() trả về một bộ lặp (iterator) của đối tượng dãy (sequence) được truyền vào theo thứ tự ngược lại.

arr = [1, 2, 3, 4, 5]
it = reversed(arr)
print(it) # <list_reverseiterator object at 0x000001E8F1A6B9A0>
print(list(it)) # [5, 4, 3, 2, 1]

str = "Hello"
it = reversed(str)
print(it) # <reversed object at 0x000001E8F1A6B9A0>
print("".join(it)) # olleH
  • Lưu ý
    Nếu đối tượng đầu vào không phải là đối tượng dãy (sequence), hàm sẽ gây ra TypeError.
num = 12345
it = reversed(num) # TypeError: 'int' object is not reversible

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn tạo một bộ lặp ngược của một đối tượng dãy, việc sử dụng cú pháp slice hoặc vòng lặp for có thể làm giảm độ đọc của mã.

arr = [1, 2, 3, 4, 5]
it = iter(arr[::-1])
print(it) # <list_iterator object at 0x000001E8F1A6B9A0>
print(list(it)) # [5, 4, 3, 2, 1]

str = "Hello"
it = ""
for x in str:
    it = x + it
print(it) # olleH

Sử dụng hàm reversed() giúp mã trở nên dễ đọc và ngắn gọn hơn.

arr = [1, 2, 3, 4, 5]
it = reversed(arr)
print(it) # <list_reverseiterator object at 0x000001E8F1A6B9A0>
print(list(it)) # [5, 4, 3, 2, 1]

str = "Hello"
it = reversed(str)
print(it) # <reversed object at 0x000001E8F1A6B9A0>
print("".join(it)) # olleH

:::

(58) round()

round() trả về kết quả làm tròn của đối số số học (kiểu số) đến số lẻ gần nhất với số chữ số chỉ định bởi đối số thứ hai (kiểu số nguyên). Nếu không có đối số thứ hai được chỉ định, nó sẽ làm tròn đến số nguyên gần nhất.

num = 3.14159
print(round(num))  # 3

num = 3.14159
digits = 2
print(round(num, digits))  # 3.14
  • Lưu ý:
    • Nếu đối số thứ hai là số âm, nó sẽ làm tròn đến số mũ của 10 tương ứng.
num = 12345
digits = -2
print(round(num, digits))  # 12300

:::note warn
Khi nào sử dụng:
Nếu bạn không sử dụng round(), bạn có thể phải thực hiện các phép toán phức tạp hơn để làm tròn một số. Sử dụng round() giúp làm cho mã của bạn dễ đọc và hiểu hơn.

num = 3.14159
assert int(num + 0.5) == 3
assert int(num * 100 + 0.5) / 100 == 3.14

Thay vào đó, bạn có thể sử dụng round():

num = 3.14159
assert round(num) == 3
assert round(num, 2) == 3.14

:::

(59) set()

set() tạo một tập hợp mới loại bỏ các phần tử trùng lặp từ đối tượng có thể lặp (iterable) được chỉ định.

arr = [1, 2, 3, 4, 4, 5]
s = set(arr)
print(s)  # {1, 2, 3, 4, 5}
  • Lưu ý:
    • Tập hợp không duy trì thứ tự, vì vậy bạn không thể truy cập các phần tử bằng chỉ số hoặc cắt.
s = {1, 2, 3, 4, 5}
print(s[0])  # TypeError: 'set' object is not subscriptable

:::note warn
Khi nào sử dụng:
Nếu bạn không sử dụng set(), bạn có thể cần sử dụng vòng lặp và câu điều kiện để loại bỏ các phần tử trùng lặp từ một iterable.

arr = [1, 2, 3, 4, 4, 5]
result = []
for x in arr:
    if x not in result:
        result.append(x)
print(result)  # [1, 2, 3, 4, 5]

Thay vào đó, bạn có thể sử dụng set():

arr = [1, 2, 3, 4, 4, 5]
result = set(arr)
print(result)  # {1, 2, 3, 4, 5}

:::

(60) setattr()

setattr() thiết lập một thuộc tính có tên đã chỉ định trên đối tượng cho giá trị đã cho. Nếu thuộc tính không tồn tại, nó sẽ tạo mới.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 20)
setattr(p, "gender", "female")  # tương đương với p.gender = "female"
print(p.gender)  # female
  • Lưu ý:
    • Tên thuộc tính phải được chỉ định dưới dạng chuỗi. Không thể sử dụng biến hoặc biểu thức.
p = Person("Alice", 20)
attr = "gender"
setattr(p, attr, "female")  # OK
setattr(p, "gen" + "der", "female")  # OK
setattr(p, attr + 1, "female")  # TypeError: can only concatenate str (not "int") to str

:::note warn
Khi nào sử dụng:
Nếu bạn không sử dụng setattr(), bạn có thể không thể đặt một thuộc tính cho một đối tượng một cách động. Bạn sẽ phải sử dụng cú pháp với dấu chấm để đặt trực tiếp giá trị của thuộc tính.

p = Person("Alice", 20)
p.gender = "female"  # OK
p.attr = "female"  # NG (tạo một thuộc tính mới là "attr")

Thay vào đó, bạn có thể sử dụng setattr():

p = Person("Alice", 20)
attr = "gender"
setattr(p, attr, "female")  # OK (tương đương với p.gender = "female")

:::

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic