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

Đăng ngày:

  67 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 [P5]

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

(41) list()

Hàm list() tạo một danh sách từ đối tượng có thể lặp được được chỉ định.

arr = list(range(5))
print(arr)  # [0, 1, 2, 3, 4]

str = list("Hello")
print(str)  # ['H', 'e', 'l', 'l', 'o']
  • Lưu ý:
    • Nếu không có đối tượng nào được chỉ định, list() sẽ trả về một danh sách rỗng.
arr = list()
print(arr)  # []

:::note warn
Nếu không biết về hàm này…
Khi bạn cần chuyển đổi một đối tượng có thể lặp được (iterable) sang một danh sách mà không cần sử dụng vòng lặp hoặc các phương pháp khác, list() là lựa chọn tốt.

# Sử dụng vòng lặp và phương thức append để tạo danh sách
arr = []
for i in range(5):
    arr.append(i)
print(arr)  # [0, 1, 2, 3, 4]
# Sử dụng hàm list() để tạo danh sách
arr = list(range(5))
print(arr)  # [0, 1, 2, 3, 4]

:::

(42) locals()

Hàm locals() trả về từ điển chứa tất cả các biến trong phạm vi cục bộ (local scope) hiện tại.

def func():
    x = 1
    y = 2
    print(locals())  # {'x': 1, 'y': 2}

func()
  • Lưu ý:
    • Ở phạm vi toàn cục, cả locals()globals() đều trả về cùng một từ điển.
x = 1
y = 2
print(locals())  # {'x': 1, 'y': 2, '__name__': '__main__', ...}
print(globals())  # {'x': 1, 'y': 2, '__name__': '__main__', ...}

:::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 các biến trong phạm vi cục bộ mà không cần truy cập chúng trực tiếp, locals() có thể giúp bạn làm điều này.

def func():
    x = 1
    y = 2
    print(x)  # 1
    print(y)  # 2

func()
def func():
    x = 1
    y = 2
    print(locals())  # {'x': 1, 'y': 2}

func()

:::

(43) map()

Hàm map() áp dụng một hàm cho mỗi phần tử của đối tượng có thể lặp được được chỉ định và trả về một iterator chứa kết quả.

def square(x):
    return x ** 2

arr = [1, 2, 3, 4, 5]
result = map(square, arr)
print(list(result))  # [1, 4, 9, 16, 25]
  • Lưu ý:
    • Hàm map() trả về một iterator, do đó bạn cần sử dụng hàm list() để chuyển đổi iterator thành danh sách.
def square(x):
    return x ** 2

arr = [1, 2, 3, 4, 5]
result = map(square, arr)
print(result)  # <map object at 0x000001E8F1A6B9A0>
print(list(result))  # [1, 4, 9, 16, 25]

:::note warn
Nếu không biết về hàm này…
Khi bạn cần áp dụng một hàm cho mỗi phần tử của một đối tượng có thể lặp được và muốn kết quả là một danh sách, map() là công cụ hữu ích.

def square(x):
    return x ** 2

arr = [1, 2, 3, 4, 5]
result = []
for x in arr:
    result.append(square(x))
print(result)  # [1, 4, 9, 16, 25]
def square(x):
    return x ** 2

arr = [1, 2, 3, 4, 5]
result = map(square, arr)
print(list(result))  # [1, 4, 9, 16, 25]

:::

(44) max()

Hàm max() trả về phần tử lớn nhất trong đối tượng có thể lặp được được chỉ định.

arr = [1, 2, 3, 4, 5]
print(max(arr))  # 5

str = "Hello"
print(max(str))  # o
  • Lưu ý:
    • Nếu đối tượng là trống, max() sẽ gây ra ValueError.
arr = []
print(max(arr))  # ValueError: max() arg is an empty sequence

:::note warn
Nếu không biết về hàm này…
Khi bạn cần tìm phần tử lớn nhất trong một đối tượng có thể lặp được và muốn tránh việc sử dụng vòng lặp hoặc các phương pháp khác, max() là lựa chọn tốt.

# Sử dụng vòng lặp để tìm phần tử lớn nhất
arr = [1, 2, 3, 4, 5]
max_value = arr[0]
for x in arr:
    if x > max_value:
        max_value = x
print(max_value)  # 5
# Sử dụng hàm max() để tìm phần tử lớn nhất
arr = [1, 2, 3, 4, 5]
print(max(arr))  # 5

:::

(45) memoryview()

memoryview() trả về một “memory view” của đối tượng mảng byte (bytearray). Memory view là một đối tượng cho phép truy cập trực tiếp vào dữ liệu nội bộ của đối tượng.

arr = bytearray(b"Hello")
mv = memoryview(arr)
print(mv)     # <memory at 0x000001E8F1A6B9A0>
print(mv[0])   # 72
print(mv[-1])  # 111
  • Lưu ý:
    • memoryview không tạo ra bản sao dữ liệu mà chỉ tạo ra một cửa sổ nhìn trực tiếp vào bộ nhớ của đối tượng ban đầu.
    • Memory view có thể thay đổi dữ liệu của đối tượng mà nó trích xuất.
arr = bytearray(b"Hello")
mv = memoryview(arr)
mv[0] = 74
print(arr)  # bytearray(b'Jello')

:::note info
Khi nào sử dụng:
Memory view thường hữu ích khi bạn muốn thực hiện các thao tác trên dữ liệu mà không cần tạo bản sao của nó. Điều này có thể giúp tiết kiệm bộ nhớ và cải thiện hiệu suất.

Ví dụ, khi làm việc với dữ liệu như hình ảnh hoặc âm thanh (dữ liệu nhị phân), bạn có thể sử dụng memory view để trực tiếp thao tác và chuyển đổi một phần của dữ liệu mà không cần sao chép toàn bộ nội dung.
:::

(46) min()

min() trả về phần tử nhỏ nhất từ một đối tượng có thể lặp (iterable).

arr = [1, 2, 3, 4, 5]
print(min(arr))  # 1

str_val = "Hello"
print(min(str_val))  # 'H'
  • Lưu ý:
    • Nếu đối tượng truyền vào là trống, min() sẽ gây ra một ValueError.
arr = []
print(min(arr))  # ValueError: min() arg is an empty sequence

:::note warn
Khi nào sử dụng:
min() làm cho việc tìm kiếm phần tử nhỏ nhất của một dãy trở nên đơn giản hơn. Nếu bạn không sử dụng hàm này, bạn có thể cần sử dụng vòng lặp và câu điều kiện để tìm kiếm giá trị nhỏ nhất, điều này có thể làm tăng độ phức tạp của mã của bạn.
:::

(47) next()

next() trả về phần tử tiếp theo từ một iterator.

arr = [1, 2, 3, 4, 5]
it = iter(arr)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
  • Lưu ý:
    • Nếu đối tượng không phải là iterator, TypeError sẽ được gây ra.
    • Nếu iterator đã hết các phần tử, StopIteration sẽ được gây ra.
arr = [1, 2, 3, 4, 5]
it = iter(arr)
for i in range(6):
    print(next(it))  # 1, 2, 3, 4, 5, StopIteration

:::note warn
Khi nào sử dụng:
next() làm cho việc truy cập các phần tử của một iterator dễ dàng hơn. Nếu bạn không sử dụng next(), bạn có thể phải sử dụng một vòng lặp for để lặp qua tất cả các phần tử, điều này có thể không hiệu quả nếu bạn chỉ quan tâm đến một số ít phần tử.

arr = [1, 2, 3, 4, 5]
it = iter(arr)
for x in it:
    print(x) # 1, 2, 3, 4, 5

Dưới đây là cách viết dùng hàm next()

arr = [1, 2, 3, 4, 5]
it = iter(arr)
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3

:::

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:

(48) object()

Tạo một đối tượng mới. object là lớp cơ bản cho tất cả các lớp trong Python.

obj = object()
print(obj)  # <object object at 0x000001E8F1A6B9A0>
print(type(obj))  # <class 'object'>
  • Lưu ý: Lớp object không có thuộc tính hoặc phương thức, do đó không thể thực hiện các thao tác trên đối tượng.
obj = object()
obj.x = 1  # AttributeError: 'object' object has no attribute 'x'
obj.__str__()  # AttributeError: 'object' object has no attribute '__str__'

:::note warn
Nếu bạn không biết về hàm này…
Khi bạn định nghĩa lớp của riêng mình, việc kế thừa từ lớp object là quan trọng, đặc biệt là trong Python 2 để tránh sự khác biệt giữa lớp mới và lớp cũ dẫn đến hành vi không mong muốn. Trong Python 3, tất cả các lớp ngầm định đều kế thừa từ lớp object, vì vậy vấn đề này không còn tồn tại.

# Python 2
class A:  # Lớp cũ
    pass

class B(object):  # Lớp mới
    pass

print type(A)  # <type 'classobj'>
print type(B)  # <type 'type'>

Bằng cách sử dụng hàm object(), bạn có thể viết như sau trong Python 2:

# Python 2
class A(object):  # Lớp mới
    pass

class B(object):  # Lớp mới
    pass

print type(A)  # <type 'type'>
print type(B)  # <type 'type'>

:::

(49) oct()

Chuyển đổi đối số (số nguyên) thành chuỗi bát phân và trả về kết quả.

num = 10
print(oct(num))  # 0o12

num = -10
print(oct(num))  # -0o12
  • Lưu ý: Nếu đối số không phải là số nguyên, sẽ gây ra TypeError.
num = 3.14
print(oct(num))  # TypeError: 'float' object cannot be interpreted as an integer

:::note info
Hữu ích khi:

  • Hiển thị quyền truy cập của tệp được biểu diễn dưới dạng bát phân khi xử lý dữ liệu được biểu diễn bằng bát phân. Ví dụ, xem quyền truy cập của tệp:
import os
file = "test.txt"
mode = os.stat(file).st_mode  # Lấy quyền truy cập dưới dạng số nguyên
print(oct(mode))  # Hiển thị quyền truy cập dưới dạng bát phân
# 100644
  • Thực hiện chuyển đổi giữa hệ thống cơ số 2 và 16 với hệ thống cơ số 8. Vì hệ thống cơ số 8 chia mỗi 3 chữ số của hệ thống cơ số 2 và 16 thành một chữ số, nên chuyển đổi giữa chúng là dễ dàng. Hàm oct() hữu ích trong trường hợp này:
# Chuyển đổi giữa hệ thống cơ số 2 và 8
bin = "10101010"  # Hệ thống cơ số 2
dec = int(bin, 2)  # Chuyển đổi sang hệ thống cơ số 10
oct = oct(dec)  # Chuyển đổi sang hệ thống cơ số 8
print(bin, oct)  # Hiển thị hệ thống cơ số 2 và 8
# 10101010 252

# Chuyển đổi giữa hệ thống cơ số 8 và 2
oct = "252"  # Hệ thống cơ số 8
dec = int(oct, 8)  # Chuyển đổi sang hệ thống cơ số 10
bin = bin(dec)  # Chuyển đổi sang hệ thống cơ số 2
print(oct, bin)  # Hiển thị hệ thống cơ số 8 và 2
# 252 0b10101010
# Chuyển đổi giữa hệ thống cơ số 16 và 8
hex = "FF"  # Hệ thống cơ số 16
dec = int(hex, 16)  # Chuyển đổi sang hệ thống cơ số 10
oct = oct(dec)  # Chuyển đổi sang hệ thống cơ số 8
print(hex, oct)  # Hiển thị hệ thống cơ số 16 và 8
# FF 377

# Chuyển đổi giữa h

 thng cơ s 8 và 16
oct = "377"  # Hệ thống cơ số 8
dec = int(oct, 8)  # Chuyển đổi sang hệ thống cơ số 10
hex = hex(dec)  # Chuyển đổi sang hệ thống cơ số 16
print(oct, hex)  # Hiển thị hệ thống cơ số 8 và 16
# 377 0xff

:::

(50) open()

Mở tệp có tên được chuyển đến và trả về một đối tượng tệp. Bạn có thể chọn chế độ và mã hóa tùy chọn.

f = open("test.txt", "w", encoding="utf-8")
f.write("Hello, world!")
f.close()
  • Lưu ý: Khi mở một tệp, bạn luôn phải gọi phương thức close để đóng tệp. Nếu không, các thay đổi của bạn có thể không được lưu và có thể có khả năng không thể truy cập tệp từ các chương trình khác.
f = open("test.txt", "w", encoding="utf-8")
f.write("Hello, world!")
# f.close()  # Quên đóng tệp

Sử dụng câu lệnh with giúp tự động đóng tệp một cách an toàn.

with open("test.txt", "w", encoding="utf-8") as f:
    f.write("Hello, world!")
# Tệp sẽ tự động đóng

:::note warn
Nếu bạn không biết về hàm này…
Khi thao tác với tệp, bạn có thể phải sử dụng các mô-đun không cần thiết.

import os
os.system("echo Hello, world! > test.txt")

Bằng cách sử dụng hàm open(), bạn có thể viết như sau:

f = open("test.txt", "w", encoding="utf-8")
f.write("Hello, world!")
f.close()

:::

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