Hướng dẫn skill python - kỹ năng trăn

Python là một ngôn ngữ lập trình hướng đối tượng bậc cao. Với cấu trúc ngôn ngữ và cách tiếp cận hướng đối tượng giúp nó trở nên cực kỳ đơn giản và thanh lịch, điều này khiến Python là một ngôn ngữ hoàn hảo cho người mới bắt đầu học lập trình..

Sự phát triển của các mô hình học máy [machine learning, deep learning] và nhu cầu phân tích dữ liệu [data science, data analytic] kéo theo một sự quan tâm lớn cho một ngôn ngữ hoàn hảo như Python cho các tác vụ này. Ngoài ra, Python cũng là một ngôn ngữ ưa thích cho phát triển web hay các hệ thống nhúng, điều này khiến Python luôn nằm trong top những ngôn ngữ phổ biến nhất và từng được bình chọn là ngôn ngữ lập trình của năm [2018].

Top 10 ngôn ngữ lập trình phổ biến nhất

[số liệu tháng 5/2020 - theo TIOBE*]

Dựa trên kinh nghiệm, mình đánh giá Python là một ngôn ngữ không thể tuyệt vời hơn để bắt đầu học lập trình, đặc biệt nếu bạn muốn theo đuổi lĩnh vực phân tích dữ liệu hay trí tuệ nhân tạo. 

Dưới đây là những skill bạn cần biết để "không còn là beginner" với Python.

Các nội dung chính:

  1. Các hàm dựng sẵn : lambda, map, filter, reduce
  2. Thao tác với list 
  3. Dunder là gì? 
  4. Một vài khái niệm cần biết trong classes
  5. Import 
  6. Decorator 
  7. Cache saving
  8. Clean code 

1. Các hàm dựng sẵn : lambda, map, filter, reduce

Mình sẽ đề cập đến từng khái niệm cũng như cách sử dụng. Các ví dụ được mô tả gồm 2 đoạn code, đoạn code phía trên là logic code thông thường, đoạn code phía dưới các hàm dựng sẵn sẽ được sử dụng. Ta hãy bắt đầu nào!

  • lambda function : Sử dụng để khai báo một hàm ẩn, không tên. Hàm lambda được sử dụng như các hàm thông thường được khai báo bằng def. : Sử dụng để khai báo một hàm ẩn, không tên. Hàm lambda được sử dụng như các hàm thông thường được khai báo bằng def. 

Một vài lưu ý:  

- Hàm lambda có thể nhận bất kỳ số lượng đối số nào, nhưng chúng chỉ chứa một biểu thức.

- Biểu thức là một đoạn mã được thực thi bởi hàm lambda, có thể trả về hoặc không trả về bất kỳ giá trị nào.bất kỳ giá trị nào.

- Hàm Lambda có thể được sử dụng để trả về các đối tượng hàm.

Về mặt cú pháp, các hàm lambda chỉ bị giới hạn ở một biểu thức duy nhất.

Cú pháp : lambda argument[s]: expressionú pháp : lambda argument[s]: expression

Ví dụ:

Hàm lambda có thể được sử dụng cùng các hàm dựng sẵn khác của Python như map[], filter[] hay reduce[].filter[] hay reduce[].

  • Map function : Hàm map sử dụng để thực hiện một hàm trên tất cả các elements [phần tử] của một đối tượng lặp [ iterable ** ] như list, set, dictionary, tuple, string. Nếu bạn chưa hiểu khái niệm iterable xem dưới cuối bài viết.: Hàm map sử dụng để thực hiện một hàm trên tất cả các elements [phần tử] của một đối tượng lặp [ iterable ** ] như list, set, dictionary, tuple, string. Nếu bạn chưa hiểu khái niệm iterable xem dưới cuối bài viết.

          Cú pháp:   map[function, iterable, ...]  map[function, iterable, ...] 

          Ví dụ : 

  • filter function : Hàm filter lọc một iterable đã cho qua một hàm test chạy qua từng phần tử trong iterable đó. : Hàm filter lọc một iterable đã cho qua một hàm test chạy qua từng phần tử trong iterable đó.

Cú pháp :  filter[function, sequence]filter[function, sequence]

Ví dụ : 

  • reduce function : Được sử dụng khi chúng ta muốn lặp lại một toán tử cho tất cả các phần tử trong iterable. Ta sẽ thử tính giai thừa ở ví dụ dưới để hiểu hơn về phương thức này nhé.: Được sử dụng khi chúng ta muốn lặp lại một toán tử cho tất cả các phần tử trong iterable. Ta sẽ thử tính giai thừa ở ví dụ dưới để hiểu hơn về phương thức này nhé.

Cú pháp : reduce[function, sequence]reduce[function, sequence]

Ví dụ : 

reduce function : Được sử dụng khi chúng ta muốn lặp lại một toán tử cho tất cả các phần tử trong iterable. Ta sẽ thử tính giai thừa ở ví dụ dưới để hiểu hơn về phương thức này nhé. : Như vậy bạn đã nắm được một vài hàm có thể hữu ích trong nhiều trường hợp và bạn có thể thấy sử dụng chúng code của bạn được rút ngắn đi khá nhiều và trông smart hơn phải không? Ngoài ra bạn cũng nên biết về một vài khái niệm đơn giản hơn như iter[] và next[] hay enumerate[] để thao tác với một đối tượng iterable.

Cú pháp : reduce[function, sequence] 

  • Kết Luận : Như vậy bạn đã nắm được một vài hàm có thể hữu ích trong nhiều trường hợp và bạn có thể thấy sử dụng chúng code của bạn được rút ngắn đi khá nhiều và trông smart hơn phải không? Ngoài ra bạn cũng nên biết về một vài khái niệm đơn giản hơn như iter[] và next[] hay enumerate[] để thao tác với một đối tượng iterable.

  • 2. Thao tác với list 

  • Đảo ngược chuỗi sử dụng [ : : -1]generator là một iterable, một dạng iterable nhưng khác ở chỗ bạn không thể tái sử dụng. 

Thay thế 1 hay nhiều phần tử liên tiếp trong list bằng một hay nhiều phần tử khác số phần tử lớn điều này sẽ là một vấn đề cho bộ nhớ. Yield giúp ta giải quyết vấn đề này. Lệnh này gần giống với return tuy nhiên return trả về một object còn yield thì trả về một generator. 

Sử dụng generator : generator là một iterable, một dạng iterable nhưng khác ở chỗ bạn không thể tái sử dụng. 

Bạn có một function trả về một list các phần tử, nếu số phần tử trong list đó nhỏ không vấn đề gì, nếu số phần tử lớn điều này sẽ là một vấn đề cho bộ nhớ. Yield giúp ta giải quyết vấn đề này. Lệnh này gần giống với return tuy nhiên return trả về một object còn yield thì trả về một generator. sau đó gọi return để trả về list này sau khi đã thực hiện xong.

Mình sẽ giải thích sự khác nhau giữa return và yield :sẽ trả về một generator, và khi bạn yêu cầu nó mới bắt đầu thực hiện các dòng lệnh cho đến khi lệnh yield nó trả lại giá trị và tạm dừng [giữ nguyên trạng thái đang xử lý]. Sau đó bạn lấy giá trị trả về, yêu cầu giá trị tiếp theo nó lại tiếp tục thực hiện và cứ như thế trả về lần lượt thay vì thực hiện hết các vòng lặp và trả về một list cuối cùng tất cả các kết quả.

=>  YIELD thường được sử dụng trong deeplearning khi ta muốn ném lần lượt từng khối dữ liệu vào model [do dữ liệu đôi khi rất nặng, tính bằng Gb nên nếu ta thực hiện xử lý tất cả xong mới ném vào model thì quả là một điều khủng khiếp cho memory].

Kết luận : Làm việc với list là một kỹ năng vô cùng quan trọng và rất thú vị trong python. : Làm việc với list là một kỹ năng vô cùng quan trọng và rất thú vị trong python.

3. Dunder là gì? 

Trong python, các Dunder [còn gọi là magic methods] là các phương thức có tiền tố và hậu tố là 2 dấu gạch dưới   __  chẳng hạn như :  __init__, __add__,  __len__,  __repr__ __init__, __add__,  __len__,  __repr__ 

Ở đây có lẽ các bạn sẽ quen thuộc nhất với  __init__     =]]

Sau đây mình sẽ giải thích một vài dunder và cách sử dụng:

  • __init__ : Khi bạn tạo ra một object, phương thức __init__ tự động được gọi đến mà không cần bạn phải trực tiếp gọi, để khởi tạo các thuộc tính được định nghĩa cho đối tượng. : Khi bạn tạo ra một object, phương thức __init__ tự động được gọi đến mà không cần bạn phải trực tiếp gọi, để khởi tạo các thuộc tính được định nghĩa cho đối tượng.

  • __repr__: Ở đoạn mã trên khi in đối tượng A ta chỉ nhận lại địa chỉ trên bộ nhớ vật lý của đối tượng. Muốn in ra được một string để đại diện cho object ta sử dụng phương thức  __repr__: Ở đoạn mã trên khi in đối tượng A ta chỉ nhận lại địa chỉ trên bộ nhớ vật lý của đối tượng. Muốn in ra được một string để đại diện cho object ta sử dụng phương thức  __repr__

  • __add__ : Hay kết hợp string object với people object như ví dụ dưới đây  : Hay kết hợp string object với people object như ví dụ dưới đây 

Ngoài ra các bạn có thể tìm hiểu các dunder khác như __len__, __iter__, __slots__, __lt__,... để code pro hơn nhé  =]]__len__, __iter__, __slots__, __lt__,... để code pro hơn nhé  =]]

4. Một vài khái niệm cần biết trong classes

  • Thuộc tính __dict__ của một đối tượng:__dict__ của một đối tượng:

Thuộc tính này lưu trữ tất cả các thuộc tính được định nghĩa của một đối tượng và giá trị của nó dưới dạng json.dạng json.

  • **kwargs : 

Khi bạn muốn truyền vào số lượng tham số không cố định, có thể là một có thể là nhiều tham số.

Tuy kwargs được khuyên dùng ở mức tối thiểu nhưng theo kinh nghiệm của mình ở những dự án lớn, các function thường được truyền vào số lượng lớn tham số sẽ sử dụng kwargs.các function thường được truyền vào số lượng lớn tham số sẽ sử dụng kwargs.

5. Import  

Khi bạn viết một file python và muốn import một vài function từ một file khác vào, do hơi lười nên bạn không muốn nhập một dãy tên các function, bạn sử dụng import * chẳng  hạn   from util import * import * chẳng  hạn   from util import * 

Trông thì có vẻ không ảnh hưởng lắm, bạn nghĩ ừ thì nó import thừa một vài function cũng chẳng sao.

Xét một ví dụ : bạn muốn from util import *  từ một file như sau  from util import *  từ một file như sau 

import numpy

import tensorflow

class Encoder:

    ...

class Decoder:

    ...

class Loss:

    ...

Khi đó, dòng lệnh này không chỉ import Encoder, Decoder, Loss mà cả numpy, tensorflow. Để tránh việc dư thừa như này, người ta sử dụng keyword __all__ . Trong file trên, nếu ta thêm vào dòng  __all__ = ['Encoder', 'Decoder']  thì khi  import *  sẽ chỉ import vào 2 function là Encoder và Decoder. Để tránh việc dư thừa như này, người ta sử dụng keyword __all__ . Trong file trên, nếu ta thêm vào dòng  __all__ = ['Encoder', 'Decoder']  thì khi  import *  sẽ chỉ import vào 2 function là Encoder và Decoder. 

Điều này sẽ giải quyết những dòng import "vô trách nhiệm" của bạn :D

6. Decorator  

Decorator là một trong những tính năng tuyệt vời nhất của Python, tuy nhiên đối với người mới bắt đầu lập trình Python, chúng có vẻ như là phép thuật vậy. Bạn sẽ thấy cách mà decorator được viết như dưới đây:

@decorator 

def function_to_decorate[]:

import tensorflow0

Các bạn sẽ nhận biết nó dựa vào @, vâng đó là một decorator. Về bản chất nó là một hàm, tuy nhiên nó là một hàm phức hợp. Một decorator nhận một hàm như là một tham số đầu vào và trả về một hàm khác. Decorator được định nghĩa theo hình thức sau:

import tensorflow1

import tensorflow2

import tensorflow3

Xem ví dụ để dễ hiểu hơn nhé

Ở đây các bạn sẽ thấy, ta gọi hàm double , hàm double này sẽ được đưa cùng với tham số x = 2 vào để hàm squared thực hiện. Rất dễ hiểu phải không! Các bạn chỉ cần nhớ ngắn gọn là "hàm thực hiện hàm".  ^.^ 

Hy vọng ví dụ này sẽ không khó hiểu!

7. Cache saving 

Bộ nhớ đệm [cache] là một kỹ thuật quan trọng do đó python cung cấp một decorator giúp ta lưu lại các tính toán trước đó. 

Các bạn có thể xem thêm tại //docs.python.org/3/library/functools.html 

             [ lru - least recently used ]

8. Clean code

Ngoài những kiến thức như đề cập ở trên bạn cũng nên chú ý đến phong cách coding, dưới đây là một vài tips dựa trên kinh nghiệm của bản thân mình:

  • Viết dòng code không quá dài, có thể xuống dòng sử dụng ký tự \ để tiếp tục viết.
  • Sử dụng các khoảng trắng [white space] trong các biểu thức và câu lệnh, như vậy code sẽ sáng sủa và dễ nhìn hơn.
  • Nên comment giải thích những dòng code khó hiểu hay định nghĩa một hàm, một class,... . Càng comment nhiều người khác càng muốn đọc code của bạn hơn =]]
  • Quy tắc đặt tên : đặt tên biến bằng chữ thường, đặt tên hằng bằng chữ in hoa. Và nên viết ngắn gọn, dễ hiểu. Các hàm nên là chữ thường và các class chữ đầu viết hoa. 
  • Có thể thêm một vài biến số ở đầu file [đặt trước import] như __all__, __version__, __author__  
  • Comment định nghĩa, giải thích một class hay function nên sử dụng 3 dấu nháy kép """ """ thay vì #

Tạm kết

Nếu bạn còn tips gì hay ho có thể chia sẻ cho mọi người hay có câu hỏi gì cần giải đáp hãy comment bên dưới nhé! Trong những bài viết sau mình sẽ chia sẻ về machine learning và deep learning

Và nếu bạn thấy bài viết hữu ích hãy cho mình đánh giá 5*. Thank you!

Chú thích :

[*] TIOBE: chỉ số TIOBE là một chỉ số về mức độ phổ biến của các ngôn ngữ lập trình, chỉ số được cập nhật mỗi tháng một lần, xếp hạng dựa trên cộng đồng các kỹ sư lập trình trên toàn thế giới, hay các công cụ tìm kiếm,... .Cần hiểu rõ rằng TIOBE không phải là chỉ số ngôn ngữ lập trình tốt nhất.

[**] Iterable là gì? Khi bạn tạo ra một list, bạn có thể truy xuất từng giá trị của list đó người ta gọi đó là iteration, mọi thứ bạn dùng cú pháp for ... in .. đều là một iterable.

[Reference] :

  1. //www.tiobe.com/tiobe-index/
  2. //github.com/chiphuyen/python-is-cool

Bài Viết Liên Quan

Chủ Đề