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

Đăng ngày:

 

Sửa ngày:

155 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 [P1]

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

(1) abs()

Hàm này trả về giá trị tuyệt đối của đối số.

num = -5
assert abs(num) == 5
  • Lưu ý:
    Nếu đối số không phải là số, đối tượng đó phải định nghĩa phương thức __abs__().
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __abs__(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5

v = Vector(3, 4)
assert abs(v) == 5

:::note warn
Nếu không biết về hàm này…
Khi bạn cần tính giá trị tuyệt đối và thực hiện câu lệnh rẽ nhánh không cần thiết hoặc nhập mô-đun không cần thiết, bạn sẽ cần biết về hàm này.

import math

num = -5
if num < 0:
    num = -num
assert num == 5

num = -5
num = math.fabs(num)
assert num == 5

:::

(2) aiter()

Hàm này chuyển đổi một đối tượng lặp không đồng bộ được chỉ định thành một trình lặp không đồng bộ. Đối tượng lặp không đồng bộ là một đối tượng có phương thức __aiter__() trả về trình lặp không đồng bộ và trình lặp không đồng bộ là một đối tượng có phương thức __anext__() trả về trình tạo số không đồng bộ.

import asyncio

async def async_gen():
    for i in range(3):
        yield i
        await asyncio.sleep(1)

async def main():
    async for i in aiter(async_gen()):
        print(i)

asyncio.run(main()) # Xuất 0, 1, 2 mỗi giây
  • Lưu ý:
    Hàm aiter() chỉ hoạt động với đối tượng lặp không đồng bộ. Nó sẽ gây ra TypeError nếu được gọi với một đối tượng lặp thông thường.
aiter([1, 2, 3]) # TypeError: 'list' object is not an async iterable

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn lặp qua một đối tượng không đồng bộ và không thể sử dụng async for do giới hạn của await, bạn cần biết về aiter(). Bạn có thể sử dụng aiter() để chuyển đối tượng lặp không đồng bộ và sau đó sử dụng anext() để lấy từng phần tử.

import asyncio

async def async_gen():
    for i in range(3):
        yield i
        await asyncio.sleep(1)

async def main():
    async_iter = aiter(async_gen())
    while True:
        try:
            i = await anext(async_iter)
            print(i)
        except StopAsyncIteration:
            break

asyncio.run(main())

:::

(3) all()

Hàm này trả về True nếu tất cả các phần tử của đối số (đối tượng có thể lặp) là True.

arr = [True, True]
assert all(arr) is True

arr = [True, False]
assert all(arr) is False
  • Lưu ý:
    Nếu đối số trống,

    hàm vẫn trả về True.

arr = []
assert all(arr) is True

:::note warn
Nếu không biết về hàm này…
Khi bạn muốn kiểm tra nhiều điều kiện và cần sử dụng and nhiều lần, bạn sẽ viết mã nguồn dài và khó đọc. Hàm all() giúp rút ngắn và làm cho mã nguồn của bạn trở nên rõ ràng hơn.

sample_1 = True
sample_2 = True
sample_3 = False
sample_4 = True
sample_5 = False
assert (sample_1 is True and sample_2 is True and sample_3 is True and sample_4 is True and sample_5 is True) is True

Sử dụng all() giúp rút gọn mã nguồn:

sample_1 = True
sample_2 = True
sample_3 = False
sample_4 = True
sample_5 = False
arr = [sample_1, sample_2, sample_3, sample_4, sample_5]
assert all(arr) is True

:::

(4) anext()

Hàm này lấy phần tử tiếp theo từ trình lặp không đồng bộ được chỉ định. Nếu trình lặp kết thúc và bạn đã chỉ định giá trị mặc định, hàm sẽ trả về giá trị mặc định đó. Nếu không có giá trị mặc định, hàm sẽ ném ngoại lệ StopAsyncIteration.

import asyncio

async def async_gen():
    for i in range(3):
        yield i
        await asyncio.sleep(1)

async def main():
    it = aiter(async_gen())
    print(await anext(it)) # 0
    print(await anext(it)) # 1
    print(await anext(it)) # 2
    print(await anext(it, 'end')) # end

asyncio.run(main())
  • Lưu ý:
    Hàm anext() chỉ hoạt động với trình lặp không đồng bộ. Nó sẽ gây ra TypeError nếu được gọi với một trình lặp thông thường.
anext(iter([1, 2, 3])) # TypeError: 'list_iterator' object is not an async iterator

:::note info
Lợi ích khi sử dụng
Hữu ích khi bạn muốn lặp qua một trình lặp không đồng bộ và chỉ chọn những phần tử thỏa mãn điều kiện nhất định. Ví dụ, trong đoạn mã sau, chúng tôi chỉ lấy những số lẻ từ một trình lặp không đồng bộ.

import asyncio

async def async_gen():
    for i in range(10):
        yield i
        await asyncio.sleep(1)

async def main():
    async_iter = aiter(async_gen())
    while True:
        try:
            i = await anext(async_iter)
            if i % 2 == 1:
                print(i)
        except StopAsyncIteration:
            break

asyncio.run(main())

:::

(5) any()

Hàm này trả về True nếu ít nhất một phần tử trong đối số (đối tượng có thể lặp) là True.

arr = [True, False]
assert any(arr) is True

arr = [False, False]
assert any(arr) is False
  • Lưu ý:
    Nếu đối số trống, hàm sẽ trả về False.
arr = []
assert any(arr) is False

:::note warn
Nếu không biết về hàm này…
Khi bạn cần kiểm tra nếu một trong các điều kiện là đúng và bạn không muốn sử dụng or nhiều lần, bạn cần biết về any().

sample_1 = True
sample_2 = False
sample_3 = False
sample_4 = False
sample_5 = False
assert (sample_1 is True or sample_2 is True or sample_3 is True or sample_4 is True or sample_5 is True) is True

Sử dụng any() giúp làm cho mã nguồn ngắn gọn và dễ đọc hơn:

sample_1 = True
sample_2 = False
sample_3 = False
sample_4 = False
sample_5 = False
arr = [sample_1, sample_2, sample_3, sample_4, sample_5]
assert any(arr) is True

:::

(6) ascii()

Hàm này trả về biểu diễn ASCII của đối số (đối tượng) dưới dạng chuỗi.

s = 'こんにちは'
assert ascii(s) == "'\\u3053\\u3093\\u306b\\u3061\\u306f'"
  • Lưu ý:
    Nếu đối số là một chuỗi chỉ chứa các ký tự ASCII, hàm sẽ trả về chuỗi ban đầu.
s = 'Hello'
assert ascii(s) == "'Hello'"

:::note info
Khi cần thiết
Hữu ích khi bạn muốn chuyển đổi các ký tự không ASCII thành dạng thoạt nhìn tương đương bằng cách sử dụng chuỗi unicode escape. Điều này có thể hữu ích khi bạn cần hiển thị các ký tự không ASCII trong các ngữ cảnh như lưu trữ hoặc truyền tải qua các giao thức chỉ hỗ trợ ASCII.

s = 'こんにちは'
print(ascii(s))  # Kết quả: '\u3053\u3093\u306b\u3061\u306f'

:::

(7) bin()

Hàm này chuyển đổi một số nguyên thành chuỗi nhị phân và trả về kết quả.

num = 10
assert bin(num) == '0b1010'
  • Lưu ý:
    Đối với các đối tượng không phải số nguyên, đối tượng đó phải định nghĩa phương thức __index__().
class Bit:
    def __init__(self, value):
        self.value = value

    def __index__(self):
        return self.value

b = Bit(10)
assert bin(b) == '0b1010'

:::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 nhị phân và bạn không muốn thực hiện các phép toán nhị phân và chuỗi thủ công, bạn cần biết về hàm bin().

num = 10
result = ''
while num > 0:
    result = str(num % 2) + result
    num //= 2
result = '0b' + result
assert result == '0b1010'

Sử dụng bin() giúp làm cho mã nguồn ngắn gọn hơn:

num = 10
result = bin(num)
assert result == '0b1010'

:::

(8) bool()

Hàm này chuyển đối số thành giá trị boolean và trả về kết quả. Nếu đối số được coi là đúng, hàm trả về True; nếu đối số được coi là sai, hàm trả về False.

assert bool(1) is True
assert bool(0) is False
assert bool('Hello') is True
assert bool('') is False
  • Lưu ý:
    Nếu không có đối số, hàm trả về False.
assert bool() is False

:::note info
Khi cần thiết
Hữu ích khi bạn muốn kiểm tra giá trị của một biểu thức hoặc biến và xác định nếu nó đúng hay sai.

x = input('Nhập vào một giá trị: ')
if bool(x):
    print('Bạn đã nhập:', x)
else:
    print('Bạn không nhập gì cả')
arr = [1, 2, 3, 0, 4, 5]
for x in arr:
    if bool(x):
        print(x, 'là Đúng')
    else:
        print(x, 'là Sai')

:::

(9) breakpoint()

Hàm này tạm dừng thực thi chương trình và chuyển quyền điều khiển tới trình gỡ lỗi. Được giới thiệu từ Python 3.7 trở đi.

def factorial(n, sum=0):
    if n == 0:
        return sum
    # Đặt điểm dừng để gỡ lỗi
    breakpoint()
    sum += n
    print(sum)
    return factorial(n-1, sum)

if __name__ == '__main__':
    factorial(5)
  • Lưu ý:
    Hàm breakpoint() gọi trình gỡ lỗi được cấu hình qua biến môi trường PYTHONBREAKPOINT. Theo mặc định, nó sử d

ụng mô-đun pdb, nhưng bạn có thể chọn mô-đun gỡ lỗi khác.

# Sử dụng ipdb module
import os
os.environ['PYTHONBREAKPOINT'] = 'ipdb.set_trace'

:::note warn
Nếu không biết về hàm này…
Khi bạn cần kiểm tra giá trị của biến, hiểu về luồng thực thi chương trình hoặc theo dõi sự thay đổi trong chương trình, hàm breakpoint() giúp bạn dễ dàng gỡ lỗi chương trình mà không cần thêm mã gỡ lỗi hoặc in ra các giá trị debug.

def factorial(n, sum=0):
    if n == 0:
        return sum
    # Sử dụng print để kiểm tra giá trị của biến
    print('n:', n, 'sum:', sum)
    # Sử dụng pdb để đặt điểm dừng
    import pdb; pdb.set_trace()
    sum += n
    print(sum)
    return factorial(n-1, sum)

if __name__ == '__main__':
    factorial(5)

Sử dụng breakpoint() giúp giảm đoạn mã và tạo điểm dừng dễ dàng hơn:

def factorial(n, sum=0):
    if n == 0:
        return sum
    # Sử dụng breakpoint() để đặt điểm dừng
    breakpoint()
    sum += n
    print(sum)
    return factorial(n-1, sum)

if __name__ == '__main__':
    factorial(5)

:::

(10) bytearray()

Hàm này trả về một đối tượng chuỗi có thể thay đổi đại diện cho dãy byte được xác định bởi đối số.

# Nếu đối số là một số nguyên, nó sẽ tạo một dãy byte với độ dài chỉ định
ba = bytearray(5)
print(ba)  # bytearray(b'\x00\x00\x00\x00\x00')

# Nếu đối số là một chuỗi, bạn có thể chỉ định encoding để chuyển đổi thành byte
ba = bytearray("Hello", "utf-8")
print(ba)  # bytearray(b'Hello')

# Nếu đối số là một đối tượng có thể lặp, nó sẽ tạo một dãy byte từ các giá trị của đối tượng đó
ba = bytearray([65, 66, 67])
print(ba)  # bytearray(b'ABC')
  • Lưu ý:
    Đối tượng bytearray là có thể thay đổi, vì vậy bạn có thể thực hiện các thao tác thay đổi như thêm, xóa, và gán giá trị tại các chỉ mục cụ thể.
ba = bytearray(b"Hello")
ba[0] = 74  # Thay đổi 'H' thành 'J'
print(ba)  # bytearray(b'Jello')

ba.append(33)  # Thêm ký tự '!'
print(ba)  # bytearray(b'Jello!')

ba[1:4] = b"ohn"  # Thay thế 'ell' bằng 'ohn'
print(ba)  # bytearray(b'John!')

ba[0] = 256  # Ngoại lệ nếu giá trị không nằm trong khoảng 0-255
# ValueError: byte must be in range(0, 256)

:::note warn
Nếu không biết về hàm này…
Khi bạn cần một dãy byte có thể thay đổi, hữu ích khi bạn muốn thực hiện các thao tác thay đổi trực tiếp trên dãy byte mà không cần tạo một đối tượng mới.

b = b"Hello"
# Không thể thay đổi giá trị của bytes object trực tiếp
b[0] = 74
# TypeError: 'bytes' object does not support item assignment

# Tạo một đối tượng mới sau mỗi thay đổi
b += b"!"
print(b)  # b'Hello!'

# Sử dụng bytearray để thực hiện thay đổi trực tiếp
ba = bytearray(b"Hello")
ba[0] = 74
ba += b"!"
print(ba)  # bytearray(b'Jello!')

:::

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