Code đẹp hơn trong python

Giá trị đối số default trong hàm sẽ chỉ được gán 1 lần và lưu vào bộ nhớ.

import time
from datetime import datetime
def show_second(dt=datetime.now()):
    print(dt.second)

show_second()  #=> 23
time.sleep(3)
show_second()  #=> 23

Dùng join() để nối chuỗi gọn và hiệu suất cao hơn só với +

Lấy giá trị của trong dict

person = {"name": "David", "age": 18}

Thông thường chúng ta sẽ dùng cách sau để lấy giá trị của 1 key đã tồn tại:

name = person["name"]

Tuy nhiên nếu key không tồn tại sẽ tạo ra lỗi KeyError: 'class'. Vì vậy chúng ta thường thêm điều kiện như sau:

if "name" in person:
	name = person["name"]

Tuy nhiên có 1 cách hay hơn để lấy giá trị của một dict đó là dict.get(key[, value]) và dict.setdefault(key, value).

  • dict.get(key[, value]) Hàm này nhận tối đa hai biến truyền vào:

key: là từ khoá cần tìm trong dict

**value(**optional - trường này không bắt buộc): là giá trị trả về nếu key không tìm thấy trong dict. Nếu không được gán, mặc định trả về None

  • dict.setdefault(key, value) Hàm này nhận tối đa hai biến truyền vào:

key là từ khoá cần tìm trong dict

value(optional - trường này không bắt buộc)key với giá trị value sẽ được gán vào dict nếu không tìm thấy key trong dict. Nếu không có value, mặc định giá trị là None.

Làm việc với Json

Sử dụng hàm json.loads() để convert một string JSON thành Dictionary Sử dụng hàm json.dumps() để convert một Object Python thành string JSON

json.dumps(x, indent=4) # Thụt lề 
json.dumps(x, indent=4, sort_keys=True) # Sắp sếp theo key

Code Introspection

Code introspection chính là việc khai thác thông tin về classmethodmodule ... ngay tại thời điểm runtime

  • type()

Kiểm tra type của các biến

  • isinstance() phương thức isintance() có tác dụng kiểm tra xem một object có phải là một thể hiện (instance) của class hay không. Nếu đúng, isinstance() sẽ trả về True, ngược lại trả về False.

  • hasattr() Phương thức này nhằm xác định xem object có tồn tại attribute nào đó hay không.

  • dir() Phương thức này liệt kê tất cả các thuộc tính và phương thức của bất cứ object nào.

  • id() Phương thức này trả về định danh (duy nhất) của object ở vòng đời chương trình hiện tại, trong C có thể hiểu như là địa chỉ bộ nhớ mà biến đó tham chiếu tới. Giá trị này sẽ thay đổi ở mỗi lần chạy chương trình.

  • callable() dùng để kiểm tra xem đó có phải là một hàm không.

repr(), getattr(), sys() hoặc issubclass()

Sử dụng một số hàm built-in viết code sạch đẹp hơn

  • Hàm next()

Hàm next() trả về phần tử tiếp theo trong iterator. Nếu ta thêm điều kiện cho nó, nó sẽ trả về phần tử tiếp theo thỏa mãn điều kiện.

for item in list:
    if item.name == 'item name':
        return item

Với hàm next() ta chỉ cần 1 dòng:

return next(item for item in list if item.name == 'item name')

Bạn cũng có thể thêm giá trị default trả về nếu không có item nào thỏa mãn điều kiện :

return next((item for item in list if item.name == 'item name'), None)
  • Hàm any()

Hàm any() khá giống hàm next() nhưng thay vì trả về item nếu item đó thỏa mãn điều kiện, nó sẽ trả về kiểu BooleanTrue khi tồn tại item thỏa mãn điều kiện, False khi không có item nào.

Code thường :

for item in list:
    if item.name == 'item name':
        return True
return False

Code với hàm any():

return any(item.name == 'item name' for item in list)
  • Hàm all()

Hàm all() ngược lại với hàm any(). Nó trả về True nếu tất cả phần tử trong iterator đều thỏa mãn điều kiện và False nếu ngược lại Code thông thường:

for item in list:
    if item.name != 'item name':
        return False
return True

Code với hàm all()

return all(item.name == 'item name' for item in list)
  • Hàm set()

Kiểu dữ liệu set là 1 tập hợp các giá trị mà trong đó mỗi giá trị đều là duy nhất. Hàm set() sẽ giúp các bạn loại bỏ các giá trị bị duplicate và khi dùng kết hợp với hàm list(), ta sẽ lấy ra được 1 list đã loại bỏ tất cả các giá trị bị duplicate Ví dụ

a = [1, 2, 2, 3, 4, 4, 5]
a = list(set(a))
[1, 2, 3, 4, 5]
  • Hàm enumerate()

Hàm enumerate() giúp ta có thể lấy được index của các item trong 1 vòng lặp for

for index, item in enumerate(list):
    print(index)

Bạn có thể chỉ định giá trị bắt đầu của index bằng cách thêm param start cho hàm

for index, item in enumerate(list, start=1):
    print(index)

Như trên index sẽ bắt đầu từ 1 thay vì default = 0 như cách khai báo ban đầu

Python unpacking

Lấy giá trị trong 1 iterable gán cho các biến trong 1 câu lệnh

a , b, c = [1, 2, 3]
#Kết quả:
a = 1, b = 2, c=3

Lấy ra các giá trị trong 1 iterable gán cho các biến mà không cần gán tất cả từng phần tử trong iterable

a, *b, c = [1, 2, 3, 4, 5, 6]
#Kết quả
a = 1, b = [2, 3, 4, 5], c = 6

Tạo 1 iterable từ các biến

a = 1
b = 2
c = 3
d = a, b, c
#Kết quả
d = (1, 2, 3)

Swap giá trị giữa hai biến

a, b = 1, 2
a, b = b, a
#Kết quả
a = 2, b = 1

Python collecttion

Tìm giao của 2 list

a = [1, 2, 3]
b = [3, 2, 4, 5]
c = list(set(a) & set(b))
#Kết quả
c = [2, 3]

Hợp 2 list

a = [1, 2, 3]
b = [3, 2, 4, 5]
c = list(set(a) | set(b))
#Kết quả
c = [1, 2, 3, 4, 5]

Lambda Function(Hàm ẩn danh)

Trong Python, một hàm ẩn danh là một hàm được định nghĩa mà không có tên. Trong khi các hàm bình thường sẽ được định nghĩa bằng các từ khóa def trong Python, thì các hàm ẩn danh sẽ được định nghĩa bằng từ khóa lambda. Vì vậy các hàm ẩn danh còn được gọi là các Lambda Function.

Cú pháp của Lambda Function trong python

lambda arguments: expression

Các hàm lambda có thể có bất kỳ số đối số nào nhưng chỉ có một biểu thức. Biểu thức được đánh giá và trả về. Các lambda function có thể được sử dụng ở bất cứ chỗ nào yêu cầu các đối tượng hàm

#Ví dụ về việc sử dụng các Lambda Function trong Python
double = lambda x: x * 2

print(double(5))

Chúng ta thường sử dụng lambda function khi mà cần một hàm không tên trong một khoảng thời gian ngắn.

Trong Python, chúng ta thường sử dụng lambda function làm đối số cho một hàm bậc cao hơn (một hàm mà có thể nhận các hàm khác làm đối số). Lambda function thường được sử dụng cùng với các hàm tích hợp sẵn như filter()map()...

Ví dụ khi xử dụng Lambda Function với Filter()

Hàm filter() trong Python nhận một hàm và một danh sách làm đối số. Hàm được gọi với tất cả các items trong danh sách và một danh sách mới được trả về chứa các items mà hàm đánh giá là True.

my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = list(filter(lambda x: (x%2 == 0) , my_list))

print(new_list)
#Kết quả:

[4, 6, 8, 12]

Ví dụ khi xử dụng Lambda Function với map()

Hàm map() trong Python nhận một hàm và một danh sách.

Hàm được gọi với tất cả các items trong danh sách và một danh sách mới được trả về chứa các item được hàm đó for each cho từng item. Đây là một ví dụ sử dụng hàm map() để nhân đôi tất cả các mục trong một danh sách.

my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = list(map(lambda x: x * 2 , my_list))

print(new_list)
#Kết quả:

[2, 10, 8, 12, 16, 22, 6, 24]
  • Ưu điểm

Ưu điểm khi sử dụng Lambda Function theo tìm hiểu các nhân mình thấy thì nó sẽ viết khá ngắn gọn. Tối ưu khi viết Code là rất tốt. Rất tối ưu khi cần xử lý logic trong một chỗ nhất định trong 1 khoảng thời gian ngắn

  • Nhược điểm

Ưu điểm khi sử dụng Lambda Function theo mình thì sẽ rất khó cho việc debug và maintenance.

Tag:
Code đẹp hơn trong python Reviewed by Finn on October 26, 2021 Rating: 5

No comments:

Copyright © 0xpan's Blog 2018
Online:
Development by Nguyễn Nam Hồng + Finn