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

Đăng ngày:

 

Sửa ngày:

64 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 [P3]

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

(21) enumerate()

Hàm enumerate() tạo một vòng lặp với cặp giá trị là chỉ số và giá trị của từng phần tử trong một đối tượng có thể lặp (iterable).

fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple
# 1 banana
# 2 cherry

for i, fruit in enumerate(fruits, start=1):
    print(i, fruit)
# 1 apple
# 2 banana
# 3 cherry
  • Lưu ý:
    • Chỉ số (index) mặc định bắt đầu từ 0, nhưng có thể được thay đổi bằng cách sử dụng tham số start.

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn duyệt qua cả giá trị và chỉ số của một đối tượng có thể lặp, enumerate() là một công cụ tiện ích.

# Sử dụng vòng lặp thông thường và thêm biến đếm
fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits)):
    print(i, fruits[i])
# 0 apple
# 1 banana
# 2 cherry
# Sử dụng hàm enumerate() để làm cho mã nguồn ngắn gọn hơn
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple
# 1 banana
# 2 cherry

enumerate() giúp rút ngắn mã nguồn và làm cho mã trở nên dễ đọc hơn khi bạn cần sử dụng chỉ số trong quá trình lặp.
:::

(22) eval()

eval() là một hàm trong Python được sử dụng để đánh giá một chuỗi được cung cấp dưới dạng biểu thức Python và trả về kết quả của biểu thức đó.

x = 2
y = 3
result = eval("x + y")
print(result)  # 5
  • Lưu ý:

    • Chỉ có thể chỉ định biểu thức làm đối số. Nếu chỉ định một câu lệnh hoặc câu lệnh phức tạp, sẽ gặp lỗi.
    eval("print('Hello')")  # SyntaxError: invalid syntax
    • Hãy chỉ định các chuỗi đáng tin cậy như đối số. Có thể có rủi ro thực thi mã có ý định độc hại.
    eval("os.system('rm -rf /')")  # Nguy hiểm!
    • Nếu chuỗi đối số chứa biến hoặc hàm, thì biến hoặc hàm đó phải tồn tại trong phạm vi. Nếu không, sẽ gặp lỗi.
    def square(x):
        return x ** 2
    
    eval("square(4)")  # 16
    
    eval("cube(3)")  # NameError: name 'cube' is not defined

    :::note warn
    Nếu không biết về hàm này…
    Khi bạn cần đánh giá động một biểu thức được biểu diễn dưới dạng chuỗi, nếu không sử dụng eval(), bạn sẽ phải thực hiện việc phân tích cú pháp thủ công hoặc sử dụng hàm exec, điều này có thể dẫn đến việc thực hiện các công việc không cần thiết.

# Ví dụ về phân tích cú pháp chuỗi để tính toán
expression = "2 * 3 + 4"
tokens = expression.split()
result = int(tokens[0]) * int(tokens[2]) + int(tokens[4])
print(result)  # 10

# Ví dụ sử dụng hàm exec để đánh giá
expression = "2 * 3 + 4"
exec(f"result = {expression}")
print(result)  # 10

Sử dụng hàm eval() giúp viết mã một cách gọn gàng và hiệu quả hơn:

expression = "2 * 3 + 4"
result = eval(expression)
print(result)  # 10

:::

(23) exec()

exec() là một hàm trong Python được sử dụng để thực thi một chuỗi được cung cấp dưới dạng câu lệnh Python.

code = """
x = 2
y = 3
print(x + y)
"""
exec(code)  # 5
  • Lưu ý:

    • Bạn có thể chỉ định câu lệnh hoặc câu lệnh phức tạp làm đối số, nhưng không thể chỉ định một biểu thức. Nếu chỉ định một biểu thức, sẽ xảy ra lỗi.
    exec("x + y")  # SyntaxError: Missing parentheses in call to 'exec'
    • Hãy chỉ định các chuỗi đáng tin cậy làm đối số. Có thể có rủi ro thực thi mã độc hại.
      exec("os.system('rm -rf /')")  # Nguy hiểm!
    • Nếu chuỗi đối số chứa biến hoặc hàm, biến hoặc hàm đó phải tồn tại trong phạm vi. Nếu không, sẽ xảy ra lỗi.
    def square(x):
        return x ** 2
    
    exec("print(square(4))")  # 16
    
    exec("print(cube(3))")  # NameError: name 'cube' is not defined
    • exec() không trả về giá trị. Kết quả là None.
      result = exec("print('Hello')")
      print(result)  # None
    • exec() có thể chỉ định không gian tên toàn cục hoặc cục bộ bằng cách sử dụng các không gian tên được cung cấp dưới dạng từ điển.
    exec("print(x + y)", {"x": 2, "y": 3})  # 5
    
    z = 4
    exec("print(x + y + z)", {"x": 2, "y": 3}, {"z": z})  # 9

    :::note warn
    Nếu không biết về hàm này…
    Khi bạn cần thực thi động một chuỗi biểu thức được biểu diễn, nếu không sử dụng exec(), bạn sẽ phải thực hiện phân tích cú pháp thủ công hoặc sử dụng hàm eval(), điều này có thể dẫn đến việc thực hiện các công việc không cần thiết.

# Ví dụ về phân tích cú pháp chuỗi để thực thi
code = "x = 2; y = 3; print(x + y)"
tokens = code.split(";")
for token in tokens:
    exec(token.strip())  # 5

Sử dụng hàm exec() giúp viết mã một cách gọn gàng và hiệu quả hơn:

code = "x = 2; y = 3; print(x + y)"
exec(code)  # 5

:::

(24) filter()

filter() là một hàm được sử dụng để lọc ra các phần tử thỏa mãn điều kiện từ một đối tượng có thể lặp.

def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(is_even, numbers)
print(list(evens))  # [2, 4, 6]
  • Lưu ý:
    • Hàm nhận vào một hàm và một đối tượng có thể lặp làm tham số. Hàm này sẽ được gọi với mỗi phần tử của đối tượng và trả về giá trị True hoặc False.
    • Hàm trả về một đối tượng lọc (filter object). Để chuyển đổi thành danh sách hoặc tuple, bạn có thể sử dụng các hàm như list() hoặc tuple().
def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(is_even, numbers)
print(evens)         # <filter object at 0x000001E8B0A9F7F0>
print(list(evens))    # [2, 4, 6]

Bạn cũng có thể sử dụng hàm vô danh (lambda expression) cho hàm tham số:

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens))  # [2, 4, 6]

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn lọc ra các phần tử thỏa mãn một điều kiện từ một đối tượng có thể lặp, nếu không sử dụng filter(), bạn có thể phải sử dụng vòng lặp for hoặc câu lệnh if để lọc thủ công hoặc sử dụng list comprehension để viết mã dài và phức tạp hơn.

# Sử dụng vòng lặp for và câu lệnh if để lọc
def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
evens = []
for n in numbers:
    if is_even(n):
        evens.append(n)
print(evens)  # [2, 4, 6]

# Sử dụng list comprehension để lọc
def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
evens = [n for n in numbers if is_even(n)]
print(evens)  # [2, 4, 6]

Sử dụng hàm filter() giúp viết mã ngắn gọn hơn như sau:

def is_even(x):
    return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
evens = filter(is_even, numbers)
print(list(evens))  # [2, 4, 6]

:::

(25) float()

float() là một hàm được sử dụng để chuyển đổi một số hoặc chuỗi đã cho thành số thực.

x = float(10)      # Chuyển đổi số nguyên thành số thực
print(x)           # 10.0
y = float("3.14")  # Chuyển đổi chuỗi thành số thực
print(y)           # 3.14
z = float("nan")   # Chuyển đổi chuỗi đặc biệt thành số thực (nan)
print(z)           # nan
  • Lưu ý:
    • Nếu không có tham số, hàm sẽ trả về 0.0.
      x = float()
      print(x)  # 0.0
    • Nếu tham số là một chuỗi không thể chuyển đổi thành số thực, hàm sẽ gây ra lỗi ValueError.
      x = float("abc")  # Lỗi

:::note warn
Nếu không biết về hàm này…
Khi thực hiện các phép toán hoặc so sánh số và chuỗi mà không chuyển đổi kiểu dữ liệu, có thể gặp lỗi hoặc bug do không phù hợp kiểu dữ liệu.

x = 3
y = "3.14"
z = x + y
print(z)
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

Sử dụng hàm float() giúp giải quyết vấn đề này như sau:

x = 3
y = "3.14"
z = x + float(y)
print(z)  # 6.14

:::

(26) format()

Hàm format() được sử dụng để trả về một chuỗi đã định dạng từ giá trị được chỉ định. Cách định dạng có thể được chỉ định thông qua đối số thứ hai.

x = format(12345, ",")        # Thêm dấu phẩy sau mỗi 3 chữ số
print(x)                      # 12,345
y = format(0.1234, ".2%")      # Hiển thị dạng phần trăm với 2 chữ số thập phân
print(y)                      # 12.34%
z = format(255, "x")           # Chuyển đổi thành số hex
print(z)                      # ff
  • Lưu ý:
    • Nếu không có đối số thứ hai, hàm sẽ trả về một chuỗi tương tự như khi sử dụng hàm str().
x = format(12345)
print(x)  # 123

45
  • Nếu đối số thứ hai là một chuỗi định dạng không hợp lệ, hàm sẽ gây ra lỗi ValueError.
x = format(12345, "a")  # Lỗi

:::note warn
Nếu không biết về hàm này…
Khi bạn cần nối chuỗi hoặc định dạng chuỗi, nếu không sử dụng format(), bạn có thể phải sử dụng các toán tử như + hoặc % và viết mã phức tạp hơn.

name = "Alice"
age = 20
message = "Hello, my name is " + name + " and I am " + str(age) + " years old."
print(message)
# Hello, my name is Alice and I am 20 years old.

Sử dụng hàm format() giúp mã trở nên ngắn gọn hơn như sau:

name = "Alice"
age = 20
message = "Hello, my name is {} and I am {} years old.".format(name, age)
print(message)
# Hello, my name is Alice and I am 20 years old.

:::

(27) frozenset()

frozenset() là một hàm được sử dụng để tạo và trả về một tập hợp không thể thay đổi (immutable set) từ một đối tượng có thể lặp được chỉ định.

x = frozenset([1, 2, 3, 4])  # Tạo frozenset từ danh sách
print(x)  # frozenset({1, 2, 3, 4})
y = frozenset("hello")       # Tạo frozenset từ chuỗi
print(y)  # frozenset({'h', 'e', 'l', 'o'})
z = frozenset()              # Tạo frozenset rỗng
print(z)  # frozenset()
  • Lưu ý:
    • Vì frozenset là đối tượng không thể thay đổi (immutable), nên không thể thêm hoặc xóa các phần tử từ frozenset. Nếu cố gắng thực hiện, sẽ gây ra lỗi AttributeError.
x = frozenset([1, 2, 3, 4])
x.add(5)      # Lỗi
x.remove(4)   # Lỗi
  • frozenset hỗ trợ các phép toán tập hợp như hợp, giao, hiệu, và hiệu đối xứng.
x = frozenset([1, 2, 3, 4])
y = frozenset([3, 4, 5, 6])
z = x | y  # Hợp
print(z)   # frozenset({1, 2, 3, 4, 5, 6})
w = x & y  # Giao
print(w)   # frozenset({3, 4})
v = x - y  # Hiệu
print(v)   # frozenset({1, 2})
u = x ^ y  # Hiệu đối xứng
print(u)   # frozenset({1, 2, 5, 6})

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn tạo một tập hợp từ một đối tượng có thể lặp nhưng không muốn có khả năng thay đổi, sử dụng frozenset() thay vì set() để tránh vấn đề với sự thay đổi của đối tượng.

s = set({1, 2, 3, 4, 5})
d = {s: "Hello"}
print(d)
# TypeError: unhashable type: 'set'

Sử dụng frozenset() giúp giải quyết vấn đề này như sau:

s = frozenset({1, 2, 3, 4, 5})
d = {s: "Hello"}
print(d)
# {frozenset({1, 2, 3, 4, 5}): 'Hello'}

:::

(28) getattr()

Hàm getattr() được sử dụng để lấy giá trị của một thuộc tính từ một đối tượng. Đối số đầu tiên là đối tượng, đối số thứ hai là tên thuộc tính dưới dạng chuỗi, và đối số thứ ba là giá trị mặc định (nếu thuộc tính không tồn tại).

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

p = Person("Alice", 20)
print(getattr(p, "name"))  # Alice
print(getattr(p, "age"))  # 20
print(getattr(p, "gender", "unknown"))  # unknown
print(getattr(p, "height"))  # AttributeError: 'Person' object has no attribute 'height'
  • Lưu ý:
    • Tên thuộc tính phải được chỉ định dưới dạng chuỗi.
attr = "name"
print(getattr(p, attr))  # Alice
print(getattr(p, "na" + "me"))  # Alice
print(getattr(p, 3))  # TypeError: getattr(): attribute name must be string

:::note warn
Nếu không biết về hàm này…
Khi bạn cần truy cập động thuộc tính của một đối tượng và muốn xử lý gracefully khi thuộc tính không tồn tại, getattr() là một công cụ hữu ích.

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

p = Person("Alice", 20)
while True:
    attr = input("Enter an attribute name: ")
    if attr == "quit":
        break
    value = getattr(p, attr, None)
    if value is None:
        print("No such attribute")
    else:
        print(value)

:::

(29) globals()

Hàm globals() trả về một từ điển chứa tất cả các biến hiện tại của phạm vi toàn cục, bao gồm cả các hàm và biến.

x = 10
y = 20
def foo():
    print("Hello")

g = globals()
print(g["x"])  # 10
print(g["y"])  # 20
print(g["foo"])  # <function foo at 0x000001E0F8C0A1F0>
g["x"] = 100  # Thay đổi giá trị của biến x toàn cục
g["z"] = 30  # Thêm biến toàn cục z
g["bar"] = lambda: print("World")  # Thêm hàm toàn cục bar
print(x)  # 100
print(z)  # 30
foo()  # Hello
bar()  # World
  • Lưu ý:
    • Việc thay đổi giá trị trong từ điển được trả về bởi globals() sẽ phản ánh trong phạm vi toàn cục.
# Định nghĩa biến toàn cục
x = 10
y = 20

# Gán giá trị của globals() cho một biến
g = globals()

# Thay đổi giá trị trong từ điển
g['x'] = 100
g['z'] = 30

# Kiểm tra xem bảng ký tự toàn cục có thay đổi không
print(x)  # 100
print(z)  # 30

:::note warn
Nếu không biết về hàm này…
Khi bạn cần truy cập hoặc thay đổi các biến và hàm trong phạm vi toàn cục mà không cần truy cập chúng trực tiếp, globals() là một công cụ tiện ích.

x = 10
y = 20
def foo():
    print("Hello")

def bar():
    print("World")

while True:
    name = input("Enter a global symbol name: ")
    if name == "quit":
        break
    g = globals()
    if name in g:
        value = g[name]
        if callable(value):
            value()  # Gọi hàm toàn cục
        else:
            print(value)  # Hiển thị giá trị biến toàn cục
    else:
        print("No such symbol")

:::

(30) hasattr()

hasattr() là một hàm trả về giá trị Boolean (True hoặc False) để chỉ ra liệu một đối tượng có một thuộc tính cụ thể hay không. Đối số đầu tiên là đối tượng cần kiểm tra, và đối số thứ hai là tên thuộc tính được chỉ định dưới dạng chuỗi.

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

p = Person("Alice", 20)
print(hasattr(p, "name"))  # True
print(hasattr(p, "age"))   # True
print(hasattr(p, "gender")) # False
print(hasattr(p, "height")) # False
  • Lưu ý:
    • Tên thuộc tính phải được chỉ định dưới dạng chuỗi.
    • Nếu thuộc tính tồn tại, hàm trả về True; nếu không tồn tại, trả về False.
    • Nếu bạn cố gắng sử dụng biến hoặc biểu thức làm tên thuộc tính, hàm sẽ ném ra lỗi TypeError.
attr = "name"
print(hasattr(p, attr)) # True
print(hasattr(p, "na" + "me")) # True
print(hasattr(p, 3))  # TypeError: hasattr(): attribute name must be string

:::note warn
Nếu không biết về hàm này…
Khi bạn cần kiểm tra xem một đối tượng có một thuộc tính cụ thể hay không trước khi sử dụng nó, hasattr() là một cách thuận tiện để làm điều này. Thay vì sử dụng các câu lệnh điều kiện và xử lý ngoại lệ, bạn có thể kiểm tra trực tiếp với hàm hasattr().

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

p = Person("Alice", 20)
while True:
    attr = input("Enter an attribute name: ")
    if attr == "quit":
        break
    if hasattr(p, attr):
        print(getattr(p, attr))
    else:
        print("No such attribute")

:::

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