Trang chủ»Giáo dục»Giáo dục tích hợp theo chủ đề

Giáo dục tích hợp theo chủ đề

3 Lỗi thường gặp khi mới làm quen với Python

Python là một ngôn ngữ lập trình với cú pháp đơn giản, rất dễ để học và ứng dụng Python vào các xây dựng ứng dụng phần mềm, server-script, xử lý data,... Tuy nhiên việc quá dễ để học, một số lập trình viên thay vì học sâu - luyện nhiều bài tập với Python thì họ lại học kiểu "cưỡi ngựa xem hoa", đọc vài sample rồi tự cho là đã hiểu hết về Python.

Đến một thời điểm nào đó, khi thực sự làm việc với Python, họ lại bị chính sự "thoải mái", đơn giản của Python gây khó dễ. Đến lúc này, họ lại cho rằng Python đầy rẫy sự "lỏng lẻo" vì thi thoảng họ gặp phải một số rắc rối nho nhỏ khi cố "áp" tư duy của các ngôn ngữ lập trình khác vào chương trình được viết bằng Python.

Bài viết dưới đây, xin được chia sẻ một số lỗi mà một số lập trình viên khi mới chuyển sang dùng Python thường gặp. Hy vọng sau bài viết, sẽ giúp các bạn tiếp tục "yêu" Python.

a) Đặt trùng tên biến và function với keyword.

Không chỉ có python mà kể cả các ngôn ngữ lập trình khác cũng cần phải tránh trường hợp việc đặt tên này. Với các ngôn ngữ lập trình khác, bạn buộc phải học thuộc lòng hoặc tìm hiểu hết về các keywords "cần tránh", với Python, chỉ cần 2 lệnh là bạn đã liệt kê ra được các keywords.

import keyword

print(keyword.kwlist)

print("Total Python's keyword: {} keywords".format(len(keyword.kwlist)))

['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

Total Python's keyword: 33 keywords

Ngoài các keyword trên, trong quá trình làm việc, cũng lên tránh đặt tên trùng với các built-in functions, class có sẵn.

Để liệt kê ra các build-in name này, chúng ta dùng câu lệnh sau:

for built_in_name in __builtins__.__dict__:

print(built_in_name, end =", " )

__name__, __doc__, __package__, __loader__, __spec__, __build_class__, __import__, abs, all, any, ascii, bin, callable, chr, compile, delattr, dir, divmod, eval, exec, format, getattr, globals, hasattr, hash, hex, id, input, isinstance, issubclass, iter, len, locals, max, min, next, oct, ord, pow, print, repr, round, setattr, sorted, sum, vars, None, Ellipsis, NotImplemented, False, True, bool, memoryview, bytearray, bytes, classmethod, complex, dict, enumerate, filter, float, frozenset, property, int, list, map, object, range, reversed, set, slice, staticmethod, str, super, tuple, type, zip, __debug__, BaseException, Exception, TypeError, StopAsyncIteration, StopIteration, GeneratorExit, SystemExit, KeyboardInterrupt, ImportError, ModuleNotFoundError, OSError, EnvironmentError, IOError, WindowsError, EOFError, RuntimeError, RecursionError, NotImplementedError, NameError, UnboundLocalError, AttributeError, SyntaxError, IndentationError, TabError, LookupError, IndexError, KeyError, ValueError, UnicodeError, UnicodeEncodeError, UnicodeDecodeError, UnicodeTranslateError, AssertionError, ArithmeticError, FloatingPointError, OverflowError, ZeroDivisionError, SystemError, ReferenceError, BufferError, MemoryError, Warning, UserWarning, DeprecationWarning, PendingDeprecationWarning, SyntaxWarning, RuntimeWarning, FutureWarning, ImportWarning, UnicodeWarning, BytesWarning, ResourceWarning, ConnectionError, BlockingIOError, BrokenPipeError, ChildProcessError, ConnectionAbortedError, ConnectionRefusedError, ConnectionResetError, FileExistsError, FileNotFoundError, IsADirectoryError, NotADirectoryError, InterruptedError, PermissionError, ProcessLookupError, TimeoutError, open, copyright, credits, license, help, __IPYTHON__, display, get_ipython,

Hoặc có thể xem tại trang docs của Python:

https://docs.python.org/3/library/functions.html

b) Lấy ra giá trị từ dictionary sử dụng dấu ngoặc vuông.

Dictinoray trong Python cung cấp 2 cách để truy cập vào dict lấy ra giá trị (value) thông qua từ khóa (key): Dùng dấu ngoặc vuông và dùng fucntion `.get(key)`

Theo thói quen, thường các lập trình viên sẽ sử dụng cụm `[]` để truy cập vào dictionary.

Ví dụ:

services = {

"VT1": "Gói cước số 1",

"VT2": "Gói cước số 2",

"VT3": "Gói cước số 3"

}

print(services['VT1'])

print(services['VT2'])

print(services['VT3'])

Kết quả hiện ra:

Gói cước số 1

Gói cước số 2

Gói cước số 3

Nếu sử dụng [] và truyền và một key không có trong dict, điều gì sẽ xảy ra ?

print(services['VT4'])

---------------------------------------------------------------------------

KeyError Traceback (most recent call last)

in

----> 1 print(services['VT4'])

KeyError: 'VT4'

Nếu trong chương trình của chúng ta không có phần try-except với class KeyError hoặc Exception cho phần truy xuất dữ liệu thì chương trình sẽ bị báo lỗi và "văng" ra ngoài.

Để giải quyết vấn đề này, các Pythonista sẽ sử dụng hàm `dict.get(key)` để truy xuất vào dictionary để lấy ra dữ liệu.

print(services.get('VT1'))

print(services.get('VT2'))

print(services.get('VT3'))

print(services.get('VT4'))

Kết quả in ra màn hình:

Gói cước số 1

Gói cước số 2

Gói cước số 3

None

Trong trường hợp trong dict không có key, function trên sẽ trả về None. Chúng ta cũng có thể "ép" function trả về giá trị khác với None bằng cách thêm giá trị mặc định vào sau.

print(services.get('VT4', 'Không tồn tại gói cước'))

Kết quả in ra màn hình:

Không tồn tại gói cước

c) Sử dụng vòng lặp như một C-stype developer

Ghi chú: note này không phải để "troll" các lập trình viên C/C++ nhé.

Đề bài: Cho một list danh sách chứa các số, in ra màn hình các số trong danh sách đó.

Một lập trình viên mới chuyển sang code Python từ ngôn ngữ lập trình khác, có thể sẽ thực hiện đoạn code để in ra màn hình như sau:

numbers = [1, 2, 3, 4, 6, 10, 15]

for i in range(len(numbers)):

print(numbers[i])

Đoạn code này, vẫn cho ra kết quả đúng như yêu cầu nhưng cách làm này không phải cách mà một lập trình viên python nên dùng. Đoạn code này có sự dư thừa:

- Tạo ra một vòng lặp từ 0 --> độ dài của list.

- Truy xuất vào giá trị của list bằng index.

Tại sao lại dư thừa ? Bởi vì Python language đã cung cấp cách để lấy ra giá trị của list trong vòng lặp mà không cần truy xuất theo index.

for item in numbers:

print(item)

Nếu đề bài yêu cầu in ra cả index và giá trị tại index trong list, Python language cũng cung cấp cho chúng ta cách để lấy 2 dữ liệu trên trong cùng một lần lặp.

for index, value in enumerate(numbers):

print("index {}: value {}".format(index, value))

Kết quả in ra màn hình

index 0: value 1

index 1: value 2

index 2: value 3

index 3: value 4

index 4: value 6

index 5: value 10

index 6: value 15

SIU Review - số 131

Thông tin tuyển dụng

Thông tin cần biết

icon Giá vàng
icon Tỷ giá ngoại tệ
icon Chứng khoán