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

Đăng ngày:

  77 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 [P4]

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

(31) hash()

Hàm hash() trả về giá trị hash của đối tượng được chuyển đến nó. Giá trị hash là một số nguyên duy nhất được tính toán dựa trên nội dung hoặc định danh của đối tượng.

# Giá trị hash của một chuỗi
s = "Hello, world!"
print(hash(s))  # 5980307948332718216

# Giá trị hash của một số
n = 42
print(hash(n))  # 42

# Giá trị hash của một danh sách (gây ra lỗi)
l = [1, 2, 3]
print(hash(l))  # TypeError: unhashable type: 'list'
  • Lưu ý:
    • Giá trị hash phải là một số nguyên.
    • Đối tượng được xem là “hashable” (có thể hash) nếu giá trị hash của nó không thay đổi trong suốt quá trình sống của nó. Do đó, các đối tượng không thể thay đổi được (immutable) thường là hashable.
    • Đối với đối tượng không thể hashable như danh sách, bạn sẽ nhận được một lỗi TypeError.
# Sử dụng hash() với số thực hoặc số phức (gây ra lỗi)
f = 3.14
c = 1 + 2j
print(hash(f))  # TypeError: 'float' object cannot be interpreted as an integer
print(hash(c))  # TypeError: can't convert complex to int

:::note warn
Nếu không biết về hàm này…
Khi bạn cần so sánh và xác định sự độc lập của các đối tượng, đặc biệt là khi sử dụng chúng như là khóa trong các cấu trúc dữ liệu như từ điển (dictionary) hoặc tập hợp (set), bạn có thể sử dụng giá trị hash của chúng thay vì so sánh trực tiếp nội dung hay định danh.

# So sánh chuỗi bằng cách sử dụng giá trị hash
s1 = "Hello"
s2 = "Hello"
print(hash(s1) == hash(s2))  # True

# So sánh số bằng cách sử dụng giá trị hash
n1 = 42
n2 = 42
print(hash(n1) == hash(n2))  # True

:::

(32) help()

Hàm help() được sử dụng để hiển thị thông tin trợ giúp v

ề một đối tượng cụ thể. Nếu không có đối tượng được cung cấp, nó sẽ khởi chạy hệ thống trợ giúp tương tác.

# Hiển thị thông tin trợ giúp về chuỗi
help(str)

# Khởi chạy hệ thống trợ giúp tương tác
help()
  • Lưu ý:
    • Thông tin trợ giúp bao gồm loại đối tượng, các phương thức và thuộc tính, cũng như tài liệu mô tả chi tiết.
    • Thông tin trợ giúp được tạo dựa trên định nghĩa của đối tượng, do đó, có thể không chính xác nếu đối tượng đã được tùy chỉnh hoặc tài liệu không đầy đủ.
# Hiển thị thông tin trợ giúp về một lớp được tùy chỉnh
class MyList(list):
    def __init__(self, *args):
        super().__init__(*args)
        self.name = "MyList"

help(MyList)
# Thông tin trợ giúp có thể không chứa mô tả cho thuộc tính name

:::note warn
Nếu không biết về hàm này…
Khi bạn làm việc với các đối tượng không quen thuộc, hoặc muốn biết thêm về cách sử dụng một đối tượng cụ thể trong Python, help() là một công cụ hữu ích. Nó giúp bạn dễ dàng xem tất cả thông tin liên quan đến đối tượng mà bạn đang quan tâm.

# Tìm kiếm thông tin trợ giúp trực tiếp trên Internet
# https://docs.python.org/ja/3/library/functions.html#abs

# Hoặc đọc mã nguồn
# https://github.com/python/cpython/blob/master/Python/bltinmodule.c#L2140

# Sử dụng help() để hiển thị thông tin trợ giúp về một hàm hay lớp cụ thể
help(abs)

:::

(33) hex()

Hàm hex() chuyển đổi một số nguyên thành chuỗi thập lục phân và thêm tiền tố “0x”.

n = 255
assert hex(n) == "0xff"
  • Lưu ý:
    • Kết quả của hàm hex() là một chuỗi thập lục phân có tiền tố “0x”.
    • Hàm này chỉ hoạt động với các số nguyên.
# Sử dụng hex() với số thực (gây ra lỗi)
f = 3.14
hex(f)
# TypeError: 'float' object cannot be interpreted as an integer

# Sử dụng hex() với số phức (gây ra lỗi)
c = 1 + 2j
hex(c)
# TypeError: can't convert complex to int

:::note warn
Nếu không biết về hàm này…
Khi bạn cần chuyển đổi một số nguyên thành chuỗi thập lục phân để sử dụng trong một ngữ cảnh nào đó, hex() là một cách thuận tiện để làm điều này.

# Sử dụng phương thức tự làm để chuyển đổi số nguyên thành chuỗi thập lục phân
n = 255
hex_str = "0x{:x}".format(n)
assert hex_str == "0xff"

# Sử dụng f-string để chuyển đổi số nguyên thành chuỗi thập lục phân
n = 255
hex_str = f"0x{n:x}"
assert hex_str == "0xff"

# Sử dụng hex() để chuyển đổi số nguyên thành chuỗi thập lục phân
n = 255
hex_str = hex(n)
assert hex_str == "0xff"

:::

(34) id()

Hàm id() trả về số nguyên làm đại diện cho định danh của đối tượng được chuyển đến nó.

s = "Hello"
assert id(s) == 140664372249680  # Giá trị có thể thay đổi tùy vào môi trường thực thi
  • Lưu ý:
    • Giá trị trả về từ id() là một số nguyên duy nhất được tính toán dựa trên định danh của đối tượng.
    • Giá trị có thể thay đổi tùy vào môi trường thực thi và cách quản lý bộ nhớ.
# Hai chuỗi có cùng nội dung nhưng có id() khác nhau
s1 = "Hello"
s2 = "Hello"
assert s1 == s2  # True
assert id(s1) != id(s2)  # True

# Hai số có cùng giá trị nhưng có id() khác nhau
n1 = 1
n2 = 1
assert n1 == n2  # True
assert id(n1) != id(n2)  # True

:::note info
Khi nên sử dụng
id() có thể hữu ích khi bạn muốn kiểm tra xem hai biến có trỏ đến cùng một đối tượng hay không. Tuy nhiên, khi so sánh đối tượng dựa trên nội dung hay giá trị, bạn nên sử dụng toán tử so sánh (==), không phải id(). id() thường được sử dụng để kiểm tra đối tượng có giữ nguyên sau khi được truyền vào một hàm hoặc phương thức nào đó hay không.
:::

(35) input()

input() hiển thị đối số (chuỗi) ra màn hình và chờ người dùng nhập dữ liệu để trả về. Nếu không có đối số, nó sẽ không hiển thị gì cả. Chuỗi mà người dùng nhập vào sẽ được trả về sau khi loại bỏ ký tự xuống dòng.

# Có đối số
name = input("Tên của bạn là gì? ")
print(f"Chào bạn, {name}!")

# Không có đối số
s = input()
print(f"Bạn đã nhập: {s}")
  • Lưu ý:
    • Hàm input trả về chuỗi chính là những gì người dùng nhập vào. Do đó, nếu cần chuyển đổi sang kiểu số hoặc giá trị boolean khác, bạn cần sử dụng hàm chuyển đổi thích hợp. Ngoài ra, khi người dùng hủy bỏ hoặc nhập dữ liệu không hợp lệ, có thể xảy ra lỗi, nên việc xử lý lỗi là lời khuyên khi sử dụng hàm input.
# Chuyển đổi thành số
n = input("Nhập một số: ")
n = int(n)  # Chuyển đổi kiểu
print(f"Bình phương của {n} là {n**2}")

# Chuyển đổi thành giá trị boolean
b = input("Nhập True hoặc False: ")
b = bool(b)  # Chuyển đổi kiểu
print(f"Phủ đảo của {b} là {not b}")

# Xử lý lỗi
try:
    s = input("Nhập gì đó: ")
    print(f"Bạn đã nhập: {s}")
except EOFError:
    print("Bạn đã hủy bỏ việc nhập")
except Exception as e:
    print(f"Có lỗi xảy ra: {e}")

:::note warn
Nếu không biết về hàm này…
Để nhận dữ liệu từ người dùng, bạn cần đọc trực tiếp từ đầu vào chuẩn hoặc tạo giao diện đồ họa. Tuy nhiên, sử dụng hàm input giúp bạn dễ dàng nhận dữ liệu từ người dùng.

# Đọc trực tiếp từ đầu vào chuẩn
import sys
s = sys.stdin.readline()
print(f"Bạn đã nhập: {s}")

# Tạo giao diện đồ họa
import tkinter as tk
window = tk.Tk()
entry = tk.Entry(window)
entry.pack()
button = tk.Button(window, text="Gửi", command=lambda: print(f"Bạn đã nhập: {entry.get()}"))
button.pack()
window.mainloop()

# Sử dụng hàm input
s = input("Nhập gì đó: ")
print(f"Bạn đã nhập: {s}")

:::

(36) int()

int(object) chuyển đối số (đối tượng) thành số nguyên và trả về kết quả. Nếu đối số là số, nó sẽ được chuyển đổi thành số nguyên bằng cách làm tròn xuống. Nếu đối số là chuỗi, nó sẽ được giải thích như là một số nguyên. Nếu không có đối số, nó trả về 0. Bạn có thể chỉ định đối số thứ hai (cơ số) để chuyển đổi đối số theo cơ số đã cho. Cơ số là một số nguyên từ 2 đến 36.

# Chuyển đổi số thành số nguyên
f = 3.14
assert int(f) == 3

# Chuyển đổi chuỗi thành số nguyên
s = "123"
assert int(s) == 123

# Không có đối số
assert int() == 0

# Chuyển đổi theo cơ số
s = "ff"
assert int(s, 16) == 255
  • Lưu ý:
    • Hàm int chỉ hoạt động khi có thể chuyển đổi đối số thành số nguyên. Nếu không thể chuyển đổi, lỗi sẽ xảy ra. Các trường hợp không thể chuyển đổi bao gồm:
      • Đối số không phải là số hoặc chuỗi.
      • Đối số là chuỗi, nhưng không thể giải thích nó là số nguyên.
      • Đối số là chuỗi, nhưng không phù hợp với cơ số đã chỉ định.
# Đối số không phải là số hoặc chuỗi
l = [1, 2, 3]
int(l)
# TypeError: int() argument must be a string, a bytes-like object, or a number, not 'list'

# Đối số là chuỗi, nhưng không thể giải thích là số nguyên
s = "Hello"
int(s)
# ValueError: invalid literal for int() with base 10: 'Hello'

# Đối số là chuỗi, nhưng không phù hợp với cơ số đã chỉ định
s = "ff"
int(s, 2)
# ValueError: invalid literal for int() with base 2: 'ff'

:::note info
Nếu không biết về hàm này…
Để chuyển đổi sang số nguyên, bạn sẽ cần thực hiện các phép toán hoặc sử dụng các biểu thức chính quy. Tuy nhiên, sử dụng hàm int giúp bạn dễ dàng chuyển đổi sang số nguyên.

:::

(37) isinstance()

isinstance(object, class) trả về giá trị boolean, xác định xem đối tượng có phải là một thể hiện của lớp đã cho hay không. Bạn có thể chỉ định một lớp hoặc tuple các

lớp làm tham số thứ hai. Nếu tham số thứ hai là tuple của các lớp, nó sẽ kiểm tra xem đối tượng có phải là một thể hiện của bất kỳ lớp nào trong tuple hay không.

# Định nghĩa các lớp
class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

# Tạo thể hiện của các lớp
a = Animal("Tom")
d = Dog("Bob", "Poodle")

# Kiểm tra xem đối tượng có phải là thể hiện của lớp không
assert isinstance(a, Animal) == True
assert isinstance(d, Dog) == True
assert isinstance(d, Animal) == True  # Đúng vì có mối quan hệ kế thừa
assert isinstance(a, Dog) == False
  • Lưu ý:
    • Hàm isinstance được sử dụng để kiểm tra kiểu của đối tượng, không kiểm tra nội dung hoặc hành vi của đối tượng. Để kiểm tra nội dung hoặc hành vi của đối tượng, bạn cần sử dụng các phương thức khác.
# Kiểm tra nội dung của đối tượng
s = "Hello"
assert isinstance(s, str) == True  # Kiểm tra kiểu
assert s == "Hello" == True  # Kiểm tra nội dung

# Kiểm tra hành vi của đối tượng
l = [1, 2, 3]
assert isinstance(l, list) == True  # Kiểm tra kiểu
assert hasattr(l, "append") == True  # Kiểm tra phương thức

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn phân nhánh xử lý dựa trên kiểu của đối tượng, bạn có thể sử dụng hàm isinstance. Ví dụ, khi một hàm có thể nhận nhiều loại đối tượng, bạn có thể sử dụng isinstance để kiểm tra kiểu và thực hiện xử lý tương ứng.

def print_message(obj):
  if isinstance(obj, str):
    print("Đây là chuỗi: " + obj)
  elif isinstance(obj, (int, float)):
    print("Đây là số: " + str(obj))
  elif isinstance(obj, list):
    print("Đây là danh sách: " + str(obj))
  else:
    print("Đây là cái gì khác: " + str(obj))

print_message("Xin chào")  # Đây là chuỗi: Xin chào
print_message(3.14)  # Đây là số: 3.14
print_message([1, 2, 3])  # Đây là danh sách: [1, 2, 3]
print_message(True)  # Đây là cái gì khác: True

Hàm isinstance giúp bạn kiểm tra kiểu của đối tượng và thực hiện các hành động tương ứng.
:::

Dưới đây là bản dịch sang tiếng Việt của đoạn mã và mô tả bạn đã cung cấp:

(38) Hàm issubclass()

Hàm này trả về giá trị Boolean để xác định liệu đối số (Lớp 1, Lớp 2) có phải là lớp con của lớp đã chỉ định hay không. Lớp con là lớp được kế thừa từ lớp khác. Đối số thứ hai có thể là một lớp hoặc tuple các lớp. Trong trường hợp đối số thứ hai là tuple các lớp, nó xác định xem đối số đầu tiên có phải là lớp con của bất kỳ lớp nào trong tuple hay không.

# Định nghĩa các lớp
class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name)
        self.color = color

# Kiểm tra xem lớp có phải là lớp con hay không
assert issubclass(Dog, Animal) == True
assert issubclass(Cat, Animal) == True
assert issubclass(Dog, Cat) == False
assert issubclass(Dog, (Animal, Cat)) == True # Sử dụng tuple
  • Lưu ý: Hàm issubclass() được sử dụng để xác định mối quan hệ kế thừa giữa các lớp, không phải để xác định mối quan hệ giữa các đối tượng của lớp. Để xác định mối quan hệ giữa các đối tượng của lớp, bạn cần sử dụng hàm isinstance().
# Xác định mối quan hệ kế thừa giữa các lớp
assert issubclass(Dog, Animal) == True

# Xác định mối quan hệ giữa các đối tượng của lớp
d = Dog("Bob", "Poodle")
assert isinstance(d, Dog) == True
assert isinstance(d, Animal) == True

:::note warn
Nếu bạn không biết về hàm này…
Để xác định mối quan hệ kế thừa giữa các lớp, bạn sẽ cần kiểm tra các thuộc tính và phương thức của lớp hoặc đọc mã nguồn của nó. Tuy nhiên, sử dụng hàm issubclass() giúp bạn dễ dàng kiểm tra mối quan hệ kế thừa giữa các lớp.

# Kiểm tra các thuộc tính và phương thức của lớp
assert hasattr(Dog, "breed") == True # Lớp Dog có thuộc tính breed
assert hasattr(Dog, "name") == True # Lớp Dog có thuộc tính name
assert hasattr(Animal, "breed") == False # Lớp Animal không có thuộc tính breed
assert hasattr(Animal, "name") == True # Lớp Animal có thuộc tính name

# Đọc mã nguồn
# class Dog(Animal): # Lớp Dog kế thừa từ lớp Animal

# Sử dụng hàm issubclass()
assert issubclass(Dog, Animal) == True

:::

(39) Hàm iter()

Hàm này chuyển đổi đối số (đối tượng) thành một đối tượng lặp lại (iterator) và trả về nó. Một iterator là một đối tượng có thể trả về từng phần tử một. Bạn có thể chỉ định các đối tượng có thể lặp lại hoặc các đối tượng có thể gọi được (như hàm hoặc phương thức) làm đối số. Nếu bạn chỉ định thêm đối số thứ hai (giá trị kết thúc), iterator sẽ kết thúc khi kết quả của việc gọi đối số đầu tiên bằng đối số thứ hai.

# Chuyển đổi hàm có thể gọi được thành iterator
import random
it = iter(random.random, 0.5) # random.random trả về một số ngẫu nhiên từ 0 đến 1
assert next(it) < 0.5 # Lấy một phần tử từ iterator
assert next(it) < 0.5
# assert next(it) # Iterator kết thúc
  • Lưu ý: Hàm iter() được sử dụng để chuyển đổi đối tượng thành iterator, không phải để chuyển đổi iterator thành đối tượng có thể lặp lại. Để chuyển đổi iterator thành đối tượng có thể lặp lại, bạn cần sử dụng các phương thức khác.
# Chuyển đổi iterator thành đối tượng có thể lặp lại
it = iter([1, 2, 3])
l = list(it) # Chuyển đổi thành danh sách
print(l) # [1, 2, 3]

:::note warn
Nếu bạn không biết về hàm này…
Để chuyển đổi một đối tượng thành iterator, bạn có thể phải tự định nghĩa một lớp iterator hoặc sử dụng generators. Tuy nhiên, sử dụng hàm iter() giúp bạn dễ dàng chuyển đổi một đối tượng thành iterator.

# Tự định nghĩa lớp iterator
class MyIterator:
    def __init__(self, iterable):
        self.iterable = iterable
        self.index = 0

    def __next__(self):
        if self.index < len(self.iterable):
            value = self.iterable[self.index]
            self.index += 1
            return value


        else:
            raise StopIteration

l = [1, 2, 3]
it = MyIterator(l)
assert next(it) == 1
assert next(it) == 2
assert next(it) == 3
# assert next(it) # Iterator kết thúc

# Sử dụng generators
def my_iterator(iterable):
    for value in iterable:
        yield value

l = [1, 2, 3]
it = my_iterator(l)
assert next(it) == 1
assert next(it) == 2
assert next(it) == 3
# assert next(it) # Iterator kết thúc

# Sử dụng hàm iter()
l = [1, 2, 3]
it = iter(l)
assert next(it) == 1
assert next(it) == 2
assert next(it) == 3
# assert next(it) # Iterator kết thúc

(40) len()

Hàm len() trả về độ dài của đối số (đối tượng). Độ dài ở đây có thể là số lượng phần tử trong đối tượng hoặc số lượng ký tự trong chuỗi. Đối số có thể là một đối tượng có thể lặp, chẳng hạn như một danh sách, chuỗi hoặc dãy byte.

# Trả về độ dài của đối tượng có thể lặp
l = [1, 2, 3]
assert len(l) == 3

# Trả về độ dài của chuỗi
s = "Hello"
assert len(s) == 5

# Trả về độ dài của dãy byte
b = b"Hello"
assert len(b) == 5
  • Lưu ý:
    • Hàm len() được sử dụng để trả về độ dài của đối tượng, không phải kích thước hoặc dung lượng của đối tượng. Để biết về kích thước hoặc dung lượng, bạn cần sử dụng các phương pháp khác.
# Trả về kích thước của đối tượng
import sys
l = [1, 2, 3]
assert len(l) == 3  # Trả về độ dài
assert sys.getsizeof(l) == 88  # Trả về kích thước trong byte

# Trả về dung lượng của đối tượng
import array
a = array.array('i', [1, 2, 3])
assert len(a) == 3  # Trả về độ dài
assert a.itemsize == 4  # Trả về số byte của mỗi phần tử
assert a.buffer_info()[1] == 3  # Trả về số lượng phần tử thực sự được sử dụng
assert a.buffer_info()[0] == 140664372249680  # Trả về địa chỉ bộ nhớ

:::note warn
Nếu không biết về hàm này…
Khi bạn cần biết độ dài của một đối tượng để xử lý hoặc kiểm tra điều kiện, sử dụng len() sẽ giúp bạn ngắn gọn và hiệu quả hơn.

# Đếm bằng cách sử dụng vòng lặp
s = "Hello"
count = 0
for c in s:
    count += 1
assert count == 5

# Đếm bằng cách sử dụng vòng lặp while
s = "Hello"
count = 0
while s:
    s = s[1:]
    count += 1
assert count == 5

# Sử dụng hàm len()
s = "Hello"
assert len(s) == 5

:::

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