Hàm pprint() trong python và cách in list, dictionary đẹp và thông minh | Laptrinhcanban.com

Hàm pprint() trong python và cách in list, dictionary đẹp và thông minh

Hướng dẫn cách sử dụng hàm pprint trong python. Bằng cách sử dụng hàm pprint(), chúng ta có thể khắc phục hạn chế của hàm print() thông thường khi in các dữ liệu có cấu trúc phức tạp như list trong list hoặc dictionary, bằng cách tinh chỉnh và in chúng ra một cách đẹp và thông minh hơn trong Python.

Chúng ta có các phương pháp sử dụng hàm pprint trong python như sau:

  • Chỉ định số ký tự tối đa trên mỗi dòng in: Đối số width
  • Chỉ định số phần tử con tối đa được in trong dữ liệu lồng nhau : Đối số depth
  • Chỉ định độ thụt lề trên mỗi dòng in: Đối số indent
  • Giảm thiểu tối đa số lần ngắt dòng khi in các list có nhiều phần tử : Đối số compact

Hàm pprint trong python

Hàm pprint() trong python là gì

Hàm pprint trong python là một hàm trong module pprint cung cấp khả năng tinh chỉnh dữ liệu, giúp in dữ liệu “đẹp hơn” ra màn hình. Hàm pprint được viết tắt từ cụm từ tiếng anh pretty-print , có nghĩa là in bản đẹp trong python.

Đúng như tên gọi của nó, hàm pprint có khả năng in các đối tượng có cấu trúc phức tạp như list 2 chiều (list trong list) hoặc dictionary trong python ra màn hình một cách sạch đẹp, gọn gàng và thông minh. Hàm pprint ra đời để khắc phục hàm print() thông thường trong python, vốn cũng có khả năng in ra list hoặc dictionary ra màn hình nhưng giao diện thì thô xấu và khó quan sát dữ liệu sau khi in ra màn hinh.

Hàm pprint trong python

Ví dụ, chúng ta có một list có cấu trúc phức tạp như sau:

l = [{'Name': 'Yamada', 'Age': 20, 'Points': [80, 20]}, 
{'Name': 'Kiyoshi', 'Age': 30, 'Points': [90, 10]},
{'Name': 'Honda', 'Age': 40, 'Points': [70, 30]}]

Với cách in bằng hàm print() thông thường, kết quả in ra màn hình rất khó nhìn như sau:

print(l)
#>> [{'Name': 'Yamada', 'Age': 20, 'Points': [80, 20]}, {'Name': 'Kiyoshi', 'Age': 30, 'Points': [90, 10]}, {'Name': 'Honda', 'Age': 40, 'Points': [70, 30]}]

Tuy nhiên với bằng cách sử dụng các chức năng tinh chỉnh trong hàm pprint(), chúng ta có thể in list có cấu trúc phức tạp trên một cách gọn gàng sạch đẹp như sau:

import pprint
pprint.pprint(l)

#>> [{'Age': 20, 'Name': 'Yamada', 'Points': [80, 20]},
#>> {'Age': 30, 'Name': 'Kiyoshi', 'Points': [90, 10]},
#>> {'Age': 40, 'Name': 'Honda', 'Points': [70, 30]}]

import pprint python

Để sử dụng được hàm pprint() trong python, trước hết chúng ta cần import module pprint chứa nó vào chương trình như sau:

import pprint

Cú pháp và cách sử dụng hàm pprint() trong Python

Hàm pprint() trong Python có cú pháp tổng quát với khá nhiều đối số như sau:

pprint.pprint ( object, stream=None, indent=1, width=80, depth=None,compact=False, sort_dicts=True )

Trong đó các đối số có tác dụng như sau:

  • width : chỉ định chiều rộng đầu ra (số ký tự):
  • indent: chỉ định độ rộng thụt lề
  • depth : chỉ định độ sâu của phần tử đầu ra
  • compact:giảm thiểu ngắt dòng

Chúng ta sẽ cùng làm rõ các cách sử dụng căn bản của hàm pprint() với các đối số này ở phần dưới đây.

Chỉ định số ký tự tối đa trên mỗi dòng in | đối số width

Về mặc định thì hàm pprint() sẽ in tối đa 80 ký tự trên một dòng in và sẽ tự động ngắt dòng. Đây cũng là giá trị mặc định của đối số width kể cả khi chúng ta lược bỏ đối số này đi trong hàm.

Tuy nhiên bằng cách điều chỉnh đối số width, chúng ta có thể tự do chỉ định số ký tự tối đa (chiều rộng) của dòng in khi sử dụng hàm pprint() trong python.

Và do có sự thay đổi về số ký tự đối đa trên mỗi dòng in, dẫn đến chúng ta cũng có thể dùng width để thay đổi số dòng được in ra màn hình.

Ví dụ, số lượng ký tự tối đa trên mỗi dòng in, cũng như số dòng được in ra của dữ liệu sẽ khác nhau tùy theo giá trị của width như sau:

pprint.pprint(l)
#>> [{'Age': 20, 'Name': 'Yamada', 'Points': [80, 20]},
#>> {'Age': 30, 'Name': 'Kiyoshi', 'Points': [90, 10]},
#>> {'Age': 40, 'Name': 'Honda', 'Points': [70, 30]}]

pprint.pprint(l, width=40)
#>> [{'Age': 20,
#>> 'Name': 'Yamada',
#>> 'Points': [80, 20]},
#>> {'Age': 30,
#>> 'Name': 'Kiyoshi',
#>> 'Points': [90, 10]},
#>> {'Age': 40,
#>> 'Name': 'Honda',
#>> 'Points': [70, 30]}]



pprint.pprint(l, width=10)
#>> [{'Age': 20,
#>> 'Name': 'Yamada',
#>> 'Points': [80,
#>> 20]},
#>> {'Age': 30,
#>> 'Name': 'Kiyoshi',
#>> 'Points': [90,
#>> 10]},
#>> {'Age': 40,
#>> 'Name': 'Honda',
#>> 'Points': [70,
#>> 30]}]

Nếu chỉ định width với một giá trị lớn thì kết quả hàm pprint() sẽ giống như khi chúng ta sử dụng hàm print() bình thường như sau:

pprint.pprint(l, width=500)
#>> [{'Age': 20, 'Name': 'Yamada', 'Points': [80, 20]}, {'Age': 30, 'Name': 'Kiyoshi', 'Points': [90, 10]}, {'Age': 40, 'Name': 'Honda', 'Points': [70, 30]}]

Chỉ định số phần tử con tối đa được in trong dữ liệu lồng nhau | đối số depth

Về mặc định thì nếu trong list hoặc dictionary chứa dữ liệu lồng nhau, ví dụ như 'Points': [80, 20] chẳng hạn, thì tất cả các phần tử con trong dữ liệu lồng đó đều được in hết ra màn hình khi chúng ta sử dụng hàm pprint() trong python.

Tuy nhiên chúng ta cũng có thể chỉ định số phần tử con tối đa được in (độ sâu) của mỗi phần tử bằng cách tùy chỉnh giá trị của đối số depth.

Và nếu dữ liệu lồng nhau chứa số phần tử con vượt quá depth thì các phần tử con này sẽ được biểu thị bởi dấu ba chấm ... khi in ra màn hình như sau:

pprint.pprint(l, depth=1)
#>> [{...}, {...}, {...}]

pprint.pprint(l, depth=2)
#>> [{'Age': 20, 'Name': 'Yamada', 'Points': [...]},
#>> {'Age': 30, 'Name': 'Kiyoshi', 'Points': [...]},
#>> {'Age': 40, 'Name': 'Honda', 'Points': [...]}]

Bạn cũng có thể sử dụng kết hợp cả với đối số width với depth để kết hợp chỉ định số dòng in ra màn hình như sau:

pprint.pprint(l, depth=2, width=40)
#>> [{'Age': 20,
#>> 'Name': 'Yamada',
#>> 'Points': [...]},
#>> {'Age': 30,
#>> 'Name': 'Kiyoshi',
#>> 'Points': [...]},
#>> {'Age': 40,
#>> 'Name': 'Honda',
#>> 'Points': [...]}]

Chỉ định độ thụt lề trên mỗi dòng in | đối số indent

Về mặc định thì các dòng in ra màn hình khi sử dụng hàm pprint() sẽ có độ thụt lề indent = 1. Tuy nhiên chúng ta cũng có thể thay đổi giá trị của đối số indent để quyết định độ thụt lề khi in như sau:

pprint.pprint(l)
##> [{'Age': 20, 'Name': 'Yamada', 'Points': [80, 20]},
##> {'Age': 30, 'Name': 'Kiyoshi', 'Points': [90, 10]},
##> {'Age': 40, 'Name': 'Honda', 'Points': [70, 30]}]

pprint.pprint(l, indent=4)
##> [ {'Age': 20, 'Name': 'Yamada', 'Points': [80, 20]},
##> {'Age': 30, 'Name': 'Kiyoshi', 'Points': [90, 10]},
##> {'Age': 40, 'Name': 'Honda', 'Points': [70, 30]}]

Bạn cũng có thể sử dụng cùng với các đối số khác như width và depth như sau:

pprint.pprint(l, indent=4, width=4, depth =2)
##>[ { 'Age': 20,
##> 'Name': 'Yamada',
##> 'Points': [ 80,
##> 20]},
##> { 'Age': 30,
##> 'Name': 'Kiyoshi',
##> 'Points': [ 90,
##> 10]},
##> { 'Age': 40,
##> 'Name': 'Honda',
##> 'Points': [ 70,
##> 30]}]

Giảm thiểu tối đa số lần ngắt dòng khi in các list có nhiều phần tử | Đối số compact

Khi chúng ta in các list có quá nhiều phần tử trong python, nếu tổng ký tự của các phần tử không vừa với độ dài của một dòng in thì python sẽ tự động ngắt dòng và in từng phần tử ra màn hình như ví dụ sau đây:

import pprint
l_long = [list(range(10)), list(range(1000, 1010))]

print(l_long)
#>> [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009]]

pprint.pprint(l_long, width=40)
#>>[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#>> [1000,
#>> 1001,
#>> 1002,
#>> 1003,
#>> 1004,
#>> 1005,
#>> 1006,
#>> 1007,
#>> 1008,
#>> 1009]]

Trong các phiên bản Python 3.4 trở về trước, cách trên là cách duy nhất chúng ta có thể dùng, do đó trong một số trường hợp sẽ khiến người dùng khá khó chịu khi số lượng bị ngắt dòng trở nên quá lớn.

Tuy nhiên thật may mắn vì từ Python 3.4 trở đi, đối số compact đã được thêm vào trong hàm pprint() Python.

Khi này, để có thể giảm thiểu tối đa số ngắt chuỗi khi in như trên, chúng ta có thể chỉ định đối số compact = True khi sử dụng với các list có quá nhiều phần tử trong nó. Ví dụ list ở trên sẽ được in ra màn hình chỉ với 3 lần ngắt dòng như sau:

pprint.pprint(l_long, width=40, compact=True)
#>> [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#>> [1000, 1001, 1002, 1003, 1004, 1005,
#>> 1006, 1007, 1008, 1009]]

Ứng dụng hàm pprint() khi xử lý file excel trong Python

Hàm pprint() khá mạnh mẽ khi xử lý các đối tượng có cấu trúc phức tạp, đặc biệt là list 2 chiều (list trong list) python.

Ứng dụng khả năng này, chúng ta có thể dùng hàm pprint để in ra màn hình và kiểm tra dữ liệu có trong một file excel bằng python.

Ví dụ trong bài hướng dẫn đọc file excel trong Python, Kiyoshi đã hướng dẫn bạn đọc toàn bộ file ecxel dưới dạng một list 2 chiều (list trong list python). Sau khi đọc xong nội dung file excel rồi, chúng ta sử dụng hàm pprint() và in kết quả ra màn hình một cách gọn gàng sạch đẹp là xong.

Ví dụ, chúng ta có file excel với nội dung sau đây:
Ứng dụng hàm pprint() khi xử lý file excel trong Python

Bằng cách ứng dụng hàm pprint() trong Python, nội dung file excel trên có thể được in ra màn hình gọn gàng như sau:

[[None, 'A', 'B', 'C'],
['one', 11, 12, 13],
['two', 21, 22, 23],
['three', 31, 32, 33]]

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về hàm pprint và cách in list, dictionary đẹp và thông minh trong python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.