Tổng hợp các Module Python “khủng” mà bạn có thể đã bỏ qua

9335

Tác giả: Adam Goldschmidt

Python là một ngôn ngữ lập trình tuyệt vời, và nó chứa nhiều module tích hợp sẵn nhằm giúp chúng ta viết code tốt hơn, code đẹp hơn.

Mục tiêu

Thông qua bài viết này, chúng ta sẽ sử dụng một vài module và phương pháp ít ai biết mà có thể cải thiện được cách code của chúng ta cả về phần nhìn và tính hiệu quả.

NamedTuple

Tôi tin rằng một vài người hẳn đã biết tới câu lệnh phổ biến hơn là namedtuple từ module collections (Nếu chưa biết bạn có thể xem tại đây), nhưng kể từ phiên bản Python 3.6, một loại mới đã có trong module typingNamedTuple. Cả hai đều được thiết kế để giúp bạn nhanh chóng tạo ra những đối tượng bất biến có thể đọc được.

NamedTuple thực ra là một phiên bản viết lại của namedtuple, và theo quan điểm của tôi thì nó dễ đọc hơn nhiều:

In [2]: import typing                                                                                                                                                                                               

In [3]: class BetterLookingArticle(typing.NamedTuple): 
   ...:     title: str 
   ...:     id: int 
   ...:     description: str = "No description given." 
   ...:                                                                                                                                                                                                             

In [4]: BetterLookingArticle(title="Python is cool.", id=1)                                                                                                                                                  
BetterLookingArticle(title='Python is cool.', id=1, description='No description given.')

Còn thay vào đó nếu ta sử dụng namedtuple:

In [6]: import collections                                                                                                                                                                                          

In [7]: Article = collections.namedtuple("Article", ["title", "description", "id"])                                                                                                                                 

In [8]: Article(title="Python is cool.", id=1, description="")                                                                                                                                               
Article(title='Python is cool.', description='', id=1)

array.array

Các mảng giá trị số hiệu quả. Mảng là những loại trình tự hoạt động rất giống như list, ngoại trừ các loại đối tượng được lưu trữ bị hạn chế.

Khi sử dụng module array, chúng ta cần khởi tạo bằng 1 typecode kiểu mã mà trong đó tất cả những element phần tử đều được sử dụng. Hãy so sánh tính hiệu quả về thời gian với một list thông thường, viết nhiều số nguyên trong một file (sử dụng module pickle để viết một list thông thường):

https://gist.github.com/AdamGold/961758c66cdfe92642eabb61d9ce9866

Có thể thấy là nhanh hơn gấp 14 lần bình thường. Tất nhiên là cũng phụ thuộc vào module pickle , nhưng sử dụng mảng vẫn gọn hơn so với sử dụng list. Vậy nên nếu bạn đang dùng những giá trị số đơn giản, bạn nên cân nhắc việc sử dụng module array.

  Lập trình Python trên IntelliJ IDEA (code Python trên IntelliJ)

Việc làm python không yêu cầu kinh nghiệm

itertools.combinations

itertools là một module ấn tượng. Nó có rất nhiều phương thức khác nhau giúp tiết kiệm thời gian, tất cả đều được liệt kê ở đây. Thậm chí còn có cả một kho GitHub viết nhiều hơn về itertools.

Tôi đã sử dụng phương thức combinations trong tuần này và tôi nghĩ là tôi sẽ chia sẻ về nó. Phương thức này lấy một số lặp và một số nguyên làm đối số, và tạo ra một trình bao gồm tất cả các tổ hợp có thể có của phép lặp với một dãy số nguyên dài nhất mà không bị trùng lặp:

In [16]: import itertools                                                                                                                                                                                           
In [17]: list(itertools.combinations([1, 2, 3, 4], 2))                                                                                                                                                       
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

dict.fromkeys

Đây là cách viết một dict cách nhanh chóng và đẹp mắt với giá trị mặc định:

In [18]: dict.fromkeys(["key1", "key2", "key3"], "DEFAULT_VALUE")                                                                                                                                            
{'key1': 'DEFAULT_VALUE', 'key2': 'DEFAULT_VALUE', 'key3': 'DEFAULT_VALUE'}

Cuối cùng nhưng không kém phần quan trọng – Module dis

Module dis hỗ trợ phân tích bytecode CPython bằng cách phân tách nó.

Có thể bạn đã biết hoặc chưa biết, Python dịch mã nguồn thành một tập hợp các chỉ thị gọi là “bytecode”. Module dis giúp chúng ta xử lý những chỉ thị này, và đồng thời nó cũng là một công cụ debug tuyệt vời.

Đây là một ví dụ trong cuốn Fluent Python:

In [22]: t = (1, 2, [3, 4])                                                                                                                                                                                         
In [23]: t[2] += [30, 40]                                                                                                                                                                                           
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-af836a8d44a2> in <module>
----> 1 t[2] += [30, 40]

TypeError: 'tuple' object does not support item assignment

In [24]: t                                                                                                                                                                                                          
Out[24]: (1, 2, [3, 4, 30, 40])

Bị một lỗi nhưng hệ thống vẫn hoạt động. Tại sao lại như vậy? Nếu chúng ta nhìn vào bytecode (Tôi đã thêm chú thích gần những phần quan trọng):

In [25]: dis.dis("t[a] += b")                                                                                                                                                                                       
  1           0 LOAD_NAME                0 (t)
              2 LOAD_NAME                1 (a)
              4 DUP_TOP_TWO
              6 BINARY_SUBSCR
              8 LOAD_NAME                2 (b)
             10 INPLACE_ADD --> (value in t[a]) += b --> succeeds because list is mutable
             12 ROT_THREE
             14 STORE_SUBSCR --> Assign t[a] = our list --> Fails, t[a] is immutable.
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE

Trước khi kết thúc… 

<iframe src=”https://giphy.com/embed/l2R0eYcNq9rJUsVAA” width=”480″ height=”288″ frameBorder=”0″ class=”giphy-embed” allowFullScreen></iframe><p><a href=”https://giphy.com/gifs/latelateshow-james-corden-late-show-l2R0eYcNq9rJUsVAA”>via GIPHY</a></p>

Thanks for reading! For more Python related articles and other cool stuff, you can follow me on Medium or GitHub (I star some awesome repos!).

Xin cảm ơn các bạn đã đọc bài viết này! Để đọc nhiều bài viết hơn về Python và những chủ đề hay khác, bạn có thể follow tôi trên Medium hoặc GitHub (….

Nếu bạn thích bài viết này, hãy nhấn giữ nút để những người khác có thể tìm thấy bài viết. Bạn càng giữ lâu, bạn sẽ càng chia sẻ cho nhiều người hơn!

Và đừng ngần ngại chia sẻ thêm nhiều kiến thức bổ ích về Python ở phần bình luận bên dưới nhé!

Bài viết gốc được đăng tải tại Medium

Việc làm IT mới nhất trên TopDev, tham khảo ngay!