5 mẹo hay sử dụng python

- Phạm Duy Tùng

Mở đầu

Hiện nay, có rất nhiều thư viện do cộng đồng đóng góp và xây dựng. Ví dụ như biopython trong tin sinh học, pandas (data science), keras/tensorflow (machine learning), astropy ( cho thiên văn học - astronomy). Trước khi bắt đầu đọc bài viết này, bạn đên đọc “Python Tricks Book” của Dan Bader trước (https://dbader.org/products/python-tricks-book/). Trong sách, anh ấy đã chia sẻ một số lời khuyên và mẹo về các code python hiệu quả hơn.

Mẹo số 1: Sức mạnh của một dòng

Khi bạn đọc một đoạn giải thuật với nhiều dòng code, có thể bạn sẽ bị quên thông tin những dòng trước đó đã viết gì, đặc biệt là trong những câu lệnh điều kiện. Ví dụ:


if alpha > 7:
     beta = 999
elif alpha == 7:
    beta = 99
else:
   beta =0

Chóng ta có thể viết đơn giản hơn chỉ với một dòng code như sau.

beta = 999 if alpha > 7 else 99 if alpha == 7 else 0

thật đơn giản phải không. Bạn chỉ cần nhìn đúng một dòng là nằm được nội dung ý nghĩa của đoạn code bạn cần. Một ví dụ khác về vòng lặp for.

lst = [1, 2, 3, 4] 
lst_double = []

for num in lst:
    lst_double.append(num * 2)

Đoạn code trên có thể viết lại dưới dạng 1 dòng như sau.

lst_double = [num * 2 for num in lst]

Tất nhiên, bạn không nên “lạm dụng” one line một cách thái quá, ví dụ

import pprint; pprint.pprint(zip(('Byte', 'KByte', 'MByte', 'GByte', 'TByte'), (1 << 10*i for i in xrange(5))))

Trông nó có vẻ hơi “lố bịch” phải không.

Mẹo 2: Các thao tác nhanh trên chuỗi

Python cung cấp cho chúng ta một số cách viết ngắn gọn giúp chúng ta có thể dể dàng thao tác trên chuỗi. Để reverse một chuỗi, chúng ta sử dụng toán tử ::-1


str = 'i am alex'
print(str[::-1])
>> xela ma i

Mẹo trên cũng có thể sử dụng đối với list số nguyên.

Để nối các phần tử trong một list thành một chuỗi, chúng ta có thể dùng hàm join()


str1 = ["pig", "year" , "2019"]
str2 = "happy "
str3 = "new "


print( ' '.join(str1))
>> pig year 2019

print(str2+str3+' '.join(str1))
>> happy new year 2019

Thật tuyệt vời phải không các bạn.

Ngoài ra các bạn có thể sử dụng biếu thức chính quy để tìm kiếm chuỗi và pattern. Về biểu thức chính quy trong python, các bạn có thể tìm hiểu ở https://docs.python.org/3/library/re.html.

Mẹo số 3: Chuỗi lồng nhau

Thử tưởng tượng rằng bạn có hàng tá các list, và sau một mớ các thao tác, kết quả của bạn là một list các list. Chúng ta sẽ sử dụng itertools - một thư viện được cung cấp sẵn trong python để giải quyết vấn đề này giúp chúng ta.


import itertools
flatten = lambda x: list(itertools.chain.from_iterable(x))
s =[["this","is"],["the","year"], ["of", "pig"], ["in"], ["Việt", "Nam"]]

print(' ',join(flatten(s)))
>> this is the year of pig in Việt Nam

Nếu bạn chạy dòng code trên bị lỗi, rất có thể là do terminal của bạn không hỗ trợ tiếng việt font unicode. Hãy chuyển qua font unicode trên terminal hoặc dùng terminal của ubuntu, bash (trên window 10).

Ngoài ra, itertools còn hỗ trợ rất nhiều hàm khác để giúp chúng ta thao tác trên chuỗi lồng dễ dàng hơn. Các bạn có thể tham khảo thêm ở https://docs.python.org/2/library/itertools.html.

Mẹo 4: Cấu trúc dữ liệu đơn giản.

Chúng ta có thể xây dựng một cây đơn giản chỉ với một dòng mã lệnh:

def tree(): return defaultdict(tree)

Một ví dụ đơn giản khác là hàm tạo số nguyên chỉ với 1 dòng code ngắn gọn

reduce( (lambda r,x: r-set(range(x**2,N,x)) if (x in r) else r), 
        range(2,N), set(range(2,N)))

Python có hỗ trợ nhiều thư viện rất mạnh trong việc giải quyết các vấn đề trong thế giới thực. Ví dụ thư viện Collections

from collections import Counter
myList = [1,1,2,3,4,5,3,2,3,4,2,1,2,3]
print(Counter(myList))
Counter({2: 4, 3: 4, 1: 3, 4: 2, 5: 1})

Một lưu ý nhỏ là các thư viện này chỉ nên sử dụng khi tập dữ liệu của bạn nhỏ, nếu tập dữ liệu lớn, ví dụ bạn cần đếm số lần xuất hiện của các từ trong tập văn bản với 100GB dữ liệu. Bạn hãy dùng cách khác, ví dụ hadoop, hoặc tăng bộ nhớ ram của bạn lên, ví dụ 1 Tb chẳng hạn :)

Mẹo 5: Xuất dữ liệu ra command line dễ dàng

Để xuất dữ liệu của một list int ra command line, theo như mẹo ở trên, ta sẽ dùng hàm .join() và vòng lặp.

lst_row = [1,2,3,4,5]
print(','.join([str(x) for x in lst_row])
1,2,3,4,5

Cách đơn giản hơn chỉ với một dòng code (Ước gì mình biết cách này sớm hơn, hix).

print(*lst_row, sep=',')
1,2,3,4,5

Một mẹo khác là trong một số trường hợp duyệt mảng, bạn cần lấy giá trị và chỉ số của mảng đó để làm một số thao tác khác


lst_arr = ['a','b','c','d']

int_index = 0

for item in lst_arr:
    print(int_index, item)
    int_index = int_index + 1
    
>> 0 a
1 b
2 c
3 d

hoặc cách viết giống c/c++


for int_index in len(lst_arr):
    print(int_index, lst_arr[int_index])
    
>> 0 a
1 b
2 c
3 d

Một cách khác là sử dụng hàm có sẵn enumerate của python

for int_index, item in enumerate(lst_arr):
    print(int_index, item)
    
>> 0 a
1 b
2 c
3 d

Có rất nhiều mẹo hay để đơn giản hoá việc xuất dữ liệu ra terminal. Hãy thông tin cho mình biết nếu bạn có nhiều mẹo hay khác cần chia sẻ nhé.

Cảm ơn các bạn đã theo dõi. Hẹn gặp bạn ở các bài viết tiếp theo.

Nếu bạn thấy nội dung của bài viết thật sự hữu ích và bạn muốn đóng góp cho blog để có thêm nhiều bài viết chất lượng hơn nữa, các bạn có thể ủng hộ blog bằng một cốc trà hoặc một cốc cà phê nhỏ qua https://nhantien.momo.vn/7abl2tSivGa hoặc paypal.me/tungduypham. Sự ủng hộ của các bạn là nguồn động viên quý giá để chúng tôi có thêm động lực và chia sẻ nhiều điều mà chúng tôi tìm hiểu được đến với cộng đồng. Trân trọng cảm ơn.