3 SAI LẦM phổ biến nhất khi Lập trình PYTHON

Ngày đăng: 11/11/2019   -    Cập nhật: 23/11/2019
Bài viết này mình sẽ viết về 3 sai lầm phổ biến nhất mà mình thấy nhiều bạn mới học lập trình Python mắc phải và một số lựa chọn thay thế có thể tốt hơn!


Sai lầm phổ biến khi lập trình Python

Sai lầm phổ biến khi lập trình Python


Hãy cùng theo dõi để cải thiện code Python của bạn hơn nhé.


Sai lầm #1. Lồng if else hoặc vòng lặp quá sâu



Đây là một ví dụ về chương trình python có if else được lồng quá sâu:


# Kiểm tra xem một năm có phải là năm nhuận hay không

if year % 4 == 0:
    if year % 100 == 0:
        if year % 400 == 0:
            return True
        else:
            return False
    else:
        return True
else:
    return False


Mình sẽ lấy một câu từ Zen of Python ("Tâm pháp Python") để nói về vấn đề lồng if else hoặc lồng vòng lặp quá sâu này:


Flat is better than Nested


Và nếu bạn nhìn vào đoạn mã trên, bạn sẽ thấy các hình dạng giống như một loạt các mũi tên đi ra và quay lại như thế này:


\
 \
  \
   \
    \
    /
   /
  /
  \
   \
    \
     \
     /
    /
   /
  /
 /
/


Nó chắc chắn vẫn có thể thạy thành công, nhưng bạn đang làm chương trình của mình chậm hơn, khó nắm bắt hơn.


 
Độ khó của thuật toán khi lồng nhau có thể tăng theo cấp số nhân và khiến chương trình của bạn hoạt động chậm hơn.


Đoạn code python trên hoàn toàn có thể tái cấu trúc.


Vì thế, thay vì lồng nhau quá sâu? bạn nên thử cách khác. Đầu tiên là đảo ngược logic và sử dụng return sớm để bóc tách từng logic.



if year % 400 == 0:
    return True
if year % 100 == 0:
    return False
if year % 4 == 0:
    return True
return False


Chương trình Python sẽ đọc từ trên xuống dưới, từ trái qua phải, do đó:


Nếu số đó chia hết cho 400, thì chúng ta ngay lập tức trả về True. Mặt khác, đối với phần còn lại của chương trình, chúng ta có thể biết rằng năm đó chắc chắn không chia hết cho 400.


Vì vậy, tại thời điểm đó, bất kỳ năm nào khác chia hết cho 100 không phải là năm nhuận. Vì vậy, chúng ta bóc lớp logic đó bằng cách trả về False.


Sau đó, chúng ta có thể biết rằng year chắc chắn không phải là bội số của 400 hoặc 100 và thực hiện phần còn lại của chương trình theo cách tương tự.


Một cách khác để tránh lồng nhau là sử dụng "toán tử boolean": and, or, not. Chúng ta có thể kết hợp câu lệnh if như sau:



if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
    return True
else:
    return False


Tất nhiên, điều này cũng thường dẫn chúng ta đến sai lầm phổ biến thứ 2 trong Lập trình Python:


Sai lầm #2. Trả lại Boolean từ câu lệnh if



Chúng ta sẽ bắt đầu với ví dụ cuối cùng của chúng ta từ phía trên:


if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
    return True
else:
    return False


Lưu ý: Kiểm tra year % 100 != 0 trước khi kiểm tra year % 100 == 0 để tối ưu tốc độ. Nếu year % 100 != 0 false thì chương trình lập tức trả về kết quả mà không cần kiểm tran year % 400 == 0


Bất cứ lúc nào bạn thấy mình viết:


if something:
    return True
else:
    return False


Bạn nên nhớ rằng mệnh đề của một câu lệnh if tự nó là một boolean!


>>> year = 2000
>>> year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
True


Vì vậy, tại sao không gõ ngắn hơn một chút và trả lại trực tiếp kết quả của boolean?


return (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))
 


Xong!.


Tại thời điểm này, dòng code có thể sẽ hơi dài, nhưng nó bây giờ ít dư thừa hơn!


Lưu ý: Đôi khi tối ưu quá lại khiến code Python khó đọc, đi ngược lại với bản chất được sinh ra của Python. Vì thế, có thể bạn nên viết như sau:



def is_leap_year(year):
    return (111
        year % 4 == 0
        and (
            year % 100 != 0 
            or year % 400 == 0
        )
    )


Sai lầm #3: Lạm dụng Kiểu dữ liệu List hoặc không sử dụng kiểu dữ liệu phù hợp.



Chúng ta thử nhìn vào ví dụ sau:


some_numbers = [1, 2, 5, 7, 8, ...]
other_numbers = [1, 3, 6, 7, 9, ...]
# Hợp nhất 2 danh sách mà không có phần tử trùng nhau
for number in other_numbers:
    if number not in some_numbers:
        some_numbers.append(number)


Hoặc:


data = [["apple", 4], ["banana", 2], ["grape", 14]]
# Bạn có những quả gì?
for item in data:
    print(item[0])
# => "apple" "banana" "grape"
# Bạn có bao nhiêu quả nho (grape)?
for item in data:
    if item[0] == "grape":
        print(item[1])
# => 14


Trong trường hợp đầu tiên, bạn đang cố gắng theo dõi một số nhóm mặt hàng và bạn muốn kết hợp chúng mà không trùng lặp.


Trường hợp này tốt hơn hết là sử dụng kiểu dữ liệu set. Các set vốn đã theo dõi các items của chúng (mặc dù không theo thứ tự, vì vậy đừng sử dụng set nếu thứ tự là quan trọng).


Bạn có thể khai báo chúng bằng hàm set() đã được tích hợp sẵn trong Python hoặc với dấu ngoặc nhọn ({}).



some_numbers = {1, 2, 5, 7, 8}
other_numbers = {1, 3, 6, 7, 9}
# Sets sử dụng toán tử nhị phân or để hợp nhất
# Nó sẽ lấy các phần tử duy nhất
some_numbers | other_numbers
# => {1, 2, 3, 5, 6, 7, 8, 9}

# Bạn cũng có thể thêm các phần tử đơn!
some_numbers.add(10)
# => {1, 2, 5, 7, 8, 10}

# Nếu thêm phần tử trùng lặp thì không thay đổi gì
some_numbers.add(1)
# => {1, 2, 5, 7, 8, 10}


Trong trường hợp thứ hai, (thứ tự có lẽ cũng không quan trọng).


Lưu ý: Từ phiên bản Python 3.7 trở đi, dict đã có thứ tự


Bạn muốn theo dõi một số dữ liệu bằng một 'nhãn' hoặc một cái gì đó, nhưng có thể gom tất cả chúng lại cùng nhau và liệt kê chúng ra khi cần thiết.


Lần này, có lẽ bạn cần đến kiểu dữ liệu dictionaries.


Bạn có thể tạo những một tập hợp kiểu dictionaries bằng hàm dict() hoặc, sử dụng dấu ngoặc nhọn ({}).


Tuy nhiên, lần này, bạn cần tách các nhãn (key) và các giá trị (value) bằng dấu hai chấm.



fruits = {
    "apples": 4,
    "bananas": 2,
    "grapes": 14,
}



Bạn có thể liệt kê tất cả các key (hoặc value!).


list(fruits.keys())
# => ["apples", "bananas", "grapes"]
list(fruits.values())
# => [4, 2, 14]

# Hoặc cả hai!
list(fruits.items())
# => [("apples", 4), ("bananas", 2), ("grapes", 14)]


Và bạn có xuất các giá trị (hoặc gán giá trị mới cho nó) thông qua các key cụ thể.


# Có bao nhiêu quả nho?
fruits["grapes"]
# => 14

# Nếu đã ăn hết nho?
# Hãy gán giá trị mới cho nó
fruits["grapes"] = 0

fruits["grapes"]
# => 0


Khi bạn sử dụng một list, thuật toán của bạn lặp qua từng mục để tìm đúng mục.


Còn dict thì được xây dựng để tìm kiếm rất nhanh, vì vậy, ngay cả khi dict của bạn là một danh sách dài, việc tìm kiếm nho vẫn siêu nhanh - và dễ gõ! Không có vòng lặp!



Python đã xây dựng cách kiểu dữ liệu để phù hợp hơn cho từng trường hợp. Nó đã được tối ưu.


Vì thế, nhiệm vụ của bạn chỉ là sử dụng đúng kiểu dữ liệu mà thôi.



Đừng mắc sai lầm khi lập trình Python



Trên đây là 3 sai lầm phổ biến nhất mà những người mới học lập trình Python thường hay mắc phải. Cũng không quá khó để tránh đúng không?


>> Tham gia Khóa học Python tại NIIT để được học nhiều hơn nhé!



---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Dạy học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543 - 0353655150 
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp
Bình luận Facebook
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!