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

Đăng ngày:

  57 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 [P7]

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

(61) slice()

slice() trả về một đối tượng lát cắt (slice object) được thiết lập để lấy một phần của một dãy theo các chỉ mục được chỉ định.

s = "Hello, world!"
sl = slice(7, 12)  # Xác định phạm vi từ chỉ mục 7 đến 12 (trước chỉ mục cuối cùng)
print(s[sl])  # Sử dụng đối tượng lát cắt như một chỉ mục
# Output: World
  • Lưu ý:
    • slice() chỉ tạo một đối tượng lát cắt, không cắt thực sự dãy. Để cắt, bạn cần sử dụng đối tượng lát cắt như một chỉ mục cho dãy.
s = "Hello, world!"
sl = slice(7, 12)
print(sl)  # In đối tượng lát cắt như nó
# Output: slice(7, 12, None)

:::note warn
Khi nào sử dụng:
Nếu bạn không sử dụng slice(), bạn có thể cần sử dụng cú pháp dấu hai chấm để thực hiện các phép cắt. Tuy nhiên, cú pháp này không linh hoạt với việc thay đổi động phạm vi cắt.

s = "Hello, world!"
start = 7
end = 12
print(s[start:end])  # Chạy bình thường
# Output: World
print(s[start:])  # Chạy bình thường
# Output: world!
print(s[start::2])  # Chạy bình thường
# Output: Wrd
print(s[start::end])  # Lỗi cú pháp
# Output: SyntaxError: invalid syntax

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

s = "Hello, world!"
start = 7
end = 12
sl1 = slice(start, end)  # Không có bước
sl2 = slice(start, None)  # Không có điểm cuối
sl3 = slice(start, None, 2)  # Không có điểm cuối, bước 2
sl4 = slice(start, None, end)  # Không có điểm cuối, bước là end
print(s[sl1])  # Chạy bình thường
# Output: World
print(s[sl2])  # Chạy bình thường
# Output: world!
print(s[sl3])  # Chạy bình thường
# Output: Wrd
print(s[sl4])  # Chạy bình thường
# Output: W

Hàm slice() giúp bạn thực hiện các phép cắt một cách linh hoạt hơn. Bạn có thể tạo một đối tượng lát cắt và sử dụng nó như là chỉ mục cho dãy.
:::

(62) sorted()

sorted() trả về một danh sách mới được sắp xếp từ các phần tử của đối tượng có thể lặp (iterable) đã chỉ định.

arr = [5, 2, 4, 1, 3]
result = sorted(arr)
print(result)  # [1, 2, 3, 4, 5]
  • Lưu ý:
    • sorted() không làm thay đổi đối tượng ban đầu. Nó tạo một danh sách mới được sắp xếp.
arr = [5, 2, 4, 1, 3]
result = sorted(arr)
print(arr)  # [5, 2, 4, 1, 3]
print(result)  # [1, 2, 3, 4, 5]
arr.sort()
print(arr)  # [1, 2, 3, 4, 5]

:::note warn
Khi nào sử dụng:
Nếu bạn không sử dụng sorted(), bạn có thể phải sử dụng các vòng lặp và câu điều kiện để thực hiện một sắp xếp phức tạp hơn. Đồng thời, bạn sẽ cần tạo một bản sao của danh sách để lưu kết quả.

arr = [5, 2, 4, 1, 3]
result = arr.copy()
for i in range(len(result)):
    for j in range(i + 1, len(result)):
        if result[i] > result[j]:
            result[i], result[j] = result[j], result[i]
print(arr)  # [5, 2, 4, 1, 3]
print(result)  # [1, 2, 3, 4, 5]

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

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

:::

(63) staticmethod()

Hàm staticmethod() chuyển đổi một phương thức thành phương thức tĩnh (static method). Phương thức tĩnh là một phương thức không phụ thuộc vào lớp hoặc đối tượng. Phương thức tĩnh có thể được gọi thông qua tên lớp hoặc đối tượng, nhưng không nhận self hoặc cls làm đối số đầu tiên.

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

    @staticmethod
    def say_hello():
        print("Hello")

p = Person("Alice", 20)
Person.say_hello() # Hello
p.say_hello() # Hello
  • Lưu ý
    Phương thức tĩnh không thể truy cập vào các thuộc tính hoặc phương thức của lớp. Để truy cập vào thuộc tính hoặc phương thức của lớp, bạn cần sử dụng phương thức lớp (classmethod).
class Person:
    count = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Person.count += 1

    @staticmethod
    def get_count():
        return Person.count  # Bạn cần chỉ định tên lớp một cách rõ ràng

    @classmethod
    def get_count2(cls):
        return cls.count  # Sử dụng cls để truy cập thuộc tính của lớp

p = Person("Alice", 20)
print(Person.get_count()) # 1
print(Person.get_count2()) # 1

:::note warn
Nếu không biết về hàm này…
Bạn sẽ không thể tạo ra một phương thức thực hiện công việc chung không phụ thuộc vào lớp hoặc đối tượng. Khi định nghĩa một phương thức không sử dụng thuộc tính hoặc phương thức của lớp hoặc đối tượng, bạn sẽ phải nhận thêm self hoặc cls làm đối số không cần thiết.

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

    def say_hello(self):  # Cần phải nhận self làm đối số
        print("Hello")

p = Person("Alice", 20)
p.say_hello() # Hello

Sử dụng hàm staticmethod() giúp bạn viết mã ngắn gọn hơn và dễ đọc hơn.

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

    @staticmethod
    def say_hello():  # Không cần phải nhận self làm đối số
        print("Hello")

p = Person("Alice", 20)
p.say_hello() # Hello

:::

(64) str()

Hàm str() chuyển đổi một đối tượng thành chuỗi.

num = 123
s = str(num)
print(s) # '123'
print(type(s)) # <class 'str'>
  • Lưu ý
    Hàm str() gọi phương thức str của đối tượng để nhận chuỗi. Phương thức str trả về biểu diễn “phi chính thức” của đối tượng dưới dạng chuỗi. Nếu str không được định nghĩa, repr sẽ được gọi. Phương thức repr trả về biểu diễn “chính thức” của đối tượng.
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name} is {self.age} years old."

    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

p = Person("Alice", 20)
print(str(p)) # Alice is 20 years old.
print(repr(p)) # Person(name='Alice', age=20)

:::note warn
Nếu không biết về hàm này…
Bạn sẽ không thể chuyển đối tượng thành chuỗi một cách thuận tiện. Khi cố gắng sử dụng một đối tượng trong chuỗi, bạn có thể gặp lỗi.

num = 123
print("The number is " + num) # TypeError: can only concatenate str (not "int") to str

Hàm str() giúp bạn giải quyết vấn đề này một cách dễ dàng.

num = 123
print("The number is " + str(num)) # The number is 123

:::

(65) sum()

Hàm sum() trả về tổng các phần tử trong đối tượng có thể lặp (iterable). Bạn có thể chỉ định một giá trị khởi đầu tùy chọn làm tham số thứ hai.

arr = [1, 2, 3, 4, 5]
result = sum(arr)
print(result) # 15
result = sum(arr, 10) # Chỉ định giá trị khởi đầu là 10
print(result) # 25
  • Lưu ý
    Các phần tử trong đối tượng phải là số để sử dụng hàm sum(). Nếu đối tượng chứa chuỗi hoặc các phần tử khác, sẽ xảy ra lỗi.
arr = [1, 2, "3", 4, 5]
result = sum(arr) # TypeError: unsupported operand type(s) for +: 'int' and 'str'

:::note warn
Nếu không biết về hàm này…
Bạn sẽ phải sử dụng vòng lặp hoặc biến để tính tổng các phần tử trong đối tượng có thể lặp.

arr = [1, 

2, 3, 4, 5]
result = 0
for x in arr:
    result += x
print(result) # 15

Hàm sum() giúp mã của bạn trở nên ngắn gọn và dễ đọc hơn.

arr = [1, 2, 3, 4, 5]
result = sum(arr)
print(result) # 15

:::

(66) super()

Hàm super() trả về đối tượng của lớp cha. Đối tượng của lớp cha được sử dụng để truy cập các thuộc tính và phương thức của lớp cha từ đối tượng của lớp con.

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

    def sound(self):
        print("...")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # Gọi phương thức __init__ của lớp cha
        self.breed = breed

    def sound(self):
        super().sound()  # Gọi phương thức sound của lớp cha
        print("Woof")

d = Dog("Spot", "Labrador")
d.sound()  # ... Woof
  • Lưu ý
    Hàm super() trả về đối tượng của lớp cha dựa trên mối quan hệ kế thừa của lớp con. Bạn có thể chỉ định lớp hoặc thể hiện cụ thể nhưng thường được sử dụng mà không có đối số.
class Animal:
    def __init__(self, name):
        self.name = name

    def sound(self):
        print("...")

class Dog(Animal):
    def __init__(self, name, breed):
        Animal.__init__(self, name)  # Gọi trực tiếp phương thức __init__ của lớp cha
        self.breed = breed

    def sound(self):
        Animal.sound(self)  # Gọi trực tiếp phương thức sound của lớp cha
        print("Woof")

d = Dog("Spot", "Labrador")
d.sound()  # ... Woof

:::note warn
Nếu không biết về hàm này…
Không thể truy cập các thuộc tính hoặc phương thức của lớp cha từ đối tượng của lớp con. Bạn sẽ cần phải chỉ định tên của lớp cha hoặc thực hiện sao chép các phương thức và thuộc tính của lớp cha.

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

    def sound(self):
        print("...")

class Dog(Animal):
    def __init__(self, name, breed):
        self.name = name  # Thiết lập trực tiếp thuộc tính của lớp cha
        self.breed = breed

    def sound(self):
        print("...")  # Sao chép phương thức của lớp cha
        print("Woof")

d = Dog("Spot", "Labrador")
d.sound()  # ... Woof

Việc sử dụng hàm super() giúp giải quyết vấn đề này.

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

    def sound(self):
        print("...")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # Gọi phương thức __init__ của lớp cha
        self.breed = breed

    def sound(self):
        super().sound()  # Gọi phương thức sound của lớp cha
        print("Woof")

d = Dog("Spot", "Labrador")
d.sound()  # ... Woof

:::

67)tuple()

Hàm tuple() tạo một tuple từ một đối tượng có thể lặp. Tuple là một bộ sưu tập có thứ tự không thể thay đổi.

arr = [1, 2, 3, 4, 5]
t = tuple(arr)
print(t) # (1, 2, 3, 4, 5)
print(type(t)) # <class 'tuple'>
  • Lưu ý
    Vì tuple không thể thay đổi, nên không thể thêm, xóa hoặc sửa đổi các phần tử.
    t = (1, 2, 3, 4, 5)
    t[0] = 10 # TypeError: 'tuple' object does not support item assignment
    t.append(6) # AttributeError: 'tuple' object has no attribute 'append'
    t.remove(5) # AttributeError: 'tuple' object has no attribute 'remove'

:::note warn
Nếu không biết về hàm này…
Không thể tạo tuple từ một đối tượng có thể lặp mà không sử dụng hàm tuple, có thể dẫn đến lỗi.

arr = [1, 2, 3, 4, 5]
print(arr + (6, 7)) # TypeError: can only concatenate list (not "tuple") to list

Sử dụng hàm tuple giúp giải quyết vấn đề này.

arr = [1, 2, 3, 4, 5]
t = tuple(arr)
print(t + (6, 7)) # (1, 2, 3, 4, 5, 6, 7)

:::

68)type()

Hàm type() trả về loại của đối tượng được chỉ định. Loại là một cách mô tả loại và đặc điểm của đối tượng.

num = 123
s = "Hello"
t = (1, 2, 3)
print(type(num)) # <class 'int'>
print(type(s)) # <class 'str'>
print(type(t)) # <class 'tuple'>
  • Lưu ý
    Hàm type trả về loại của đối tượng khi có một đối số, nhưng nó sẽ tạo một loại mới nếu có ba đối số. Trong trường hợp này, đối số đầu tiên là tên loại, đối số thứ hai là tuple của các lớp cơ sở, và đối số thứ ba là từ điển chứa các thuộc tính hoặc phương thức.
# Một đối số
num = 123
print(type(num)) # <class 'int'>

# Ba đối số
Person = type("Person", (object,), {"name": "Alice", "age": 20, "say_hello": lambda self: print(f"Hello, I'm {self.name}.")})
p = Person()
print(type(p)) # <class '__main__.Person'>
print(p.name) # Alice
print(p.age) # 20
p.say_hello() # Hello, I'm Alice.

:::note warn
Nếu không biết về hàm này…
Không thể kiểm tra loại của đối tượng, điều này có thể dẫn đến lỗi do hành vi và hoạt động của đối tượng phụ thuộc vào loại của nó.

num = 123
s = "Hello"
print(num + s) # TypeError: unsupported operand type(s) for +: 'int' and 'str'

Sử dụng hàm type giúp giải quyết vấn đề này.

num = 123
s = "Hello"
print(type(num)) # <class 'int'>
print(type(s)) # <class 'str'>
print(str(num) + s) # 123Hello

:::

69)vars()

Hàm vars() trả về từ điển chứa các thuộc tính và giá trị của đối tượng được chỉ định. Nếu không có đối số, nó trả về bảng ký tự cục bộ hiện tại.

class Sample:
    def __init__(self, x, y):
        self.x = x
        self.y = y

s = Sample(1, 2)
print(vars(s)) # {'x': 1, 'y': 2}

print(vars()) # Trả về bảng ký tự cục bộ hiện tại
  • Lưu ý
    Hàm vars() hoạt động tốt với các đối tượng có thuộc tính như mô-đun, lớp, hoặc thể hiện, nhưng sẽ ném TypeError đối với các đối tượng không có thuộc tính như số hoặc chuỗi.
print(vars(1)) # TypeError: vars() argument must have __dict__ attribute

:::note info
Hàm này hữu ích khi bạn muốn xem xét trạng thái nội bộ của một đối tượng hoặc thay đổi động thuộc tính của nó.

class Sample:
    def __init__(self, x, y):
        self.x = x
        self.y = y

obj = Sample(1, 2)
print(vars(obj))
# {'x': 1, 'y': 2}

# Thêm thuộc tính động
vars(obj)['z'] = 3
print(vars(obj))
# {'x': 1, 'y': 2, 'z': 3}

# Xử lý thuộc tính như một từ điển
for key, value in vars(obj).items():
    print(f"{key} = {value}")
# x = 1
# y = 2
# z = 3

Vars cho phép bạn làm việc với thuộc tính của một đối tượng như với một từ điển, điều này giúp tăng tính linh hoạt trong lập trình hướng đối tượng.
:::

70)zip()

Hàm zip() nhận vào nhiều đối tượng có thể lặp là

m đối số và trả về một trình lặp chứa các bộ, mỗi bộ chứa các phần tử tương ứng từ các đối số.

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = zip(a, b) # Trả về một trình lặp
print(list(c)) # [(1, 'a'), (2, 'b'), (3, 'c')]
  • Lưu ý
    Nếu chiều dài của các đối số không giống nhau, zip() sẽ dừng khi đối số ngắn nhất kết thúc. Các phần tử còn lại sẽ bị bỏ qua.
a = [1, 2, 3, 4]
b = ['a', 'b', 'c']
c = zip(a, b) # Trả về một trình lặp
print(list(c)) # [(1, 'a'), (2, 'b'), (3, 'c')]

:::note warn
Nếu không biết về hàm này…
Để ghép các phần tử từ nhiều đối tượng khác nhau, bạn cần sử dụng vòng lặp hoặc biểu thức danh sách, điều này có thể làm mã của bạn trở nên lộn xộn và phức tạp.

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = []
for i in range(min(len(a), len(b))):
    c.append((a[i], b[i]))
print(c) # [(1, 'a'), (2, 'b'), (3, 'c')]

Hàm zip giúp giải quyết vấn đề này một cách ngắn gọn.

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = zip(a, b) # Trả về một trình lặp
print(list(c)) # [(1, 'a'), (2, 'b'), (3, 'c')]

:::

71)__import__()

Hàm __import__() được sử dụng để nhập một module dựa trên một tên module được cung cấp dưới dạng chuỗi. Giá trị trả về là đối tượng module được nhập.

math = __import__('math') # Nhập module math
print(math.pi) # 3.141592653589793
  • Lưu ý
    __import__() là một hàm có cấp thấp và thường được khuyến nghị sử dụng câu lệnh import thông thường. __import__() thường được sử dụng khi tên module cần nhập được xác định động hoặc khi bạn muốn tạo một cơ chế nhập tùy chỉnh.
module_name = input('Nhập tên module: ') # Nhập tên module
module = __import__(module_name) # Nhập module được nhập

:::note warn
Nếu không biết về hàm này…
Khi cần nhập một module dựa trên một tên module được xác định động, bạn sẽ không thể sử dụng câu lệnh import thông thường. Thay vào đó, bạn cần sử dụng hàm __import__(). Tuy nhiên, thường xuyên sử dụng import là lựa chọn tốt hơn để tăng độ đọc và hiểu mã nguồn.

import importlib
math = importlib.import_module('math') # Nhập module math
print(math.pi) # 3.141592653589793

Sử dụng __import__() như một ví dụ đặc biệt hoặc khi bạn muốn tùy chỉnh cơ chế nhập.

math = __import__('math') # Nhập module math
print(math.pi) # 3.141592653589793

:::

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