+7

Gotchas trong Python

Python là một ngôn ngữ quen thuộc của hầu hết những người mới lập trình. Phần lớn bởi vì Python khá đơn giản trong cấu trúc, có nhu cầu cao và đặc biệt Python là một ngôn ngữ được ứng dụng cực kì rộng rãi. Nhưng có một vài trường hợp có thể gây nhầm lẫn hay có thể gọi là "những cú lừa" dành cho những người mới, những trường hợp đó được gọi là “Gotchas”!, bắt nguồn không chính thức từ “Got You!”, Một gotcha thường là một trường hợp hoặc một kịch bản khi chương trình trả về kết quả không như mong muốn.

Một điều cần lưu ý rằng gotchas không phải lỗi hay bất kỳ một ngoại lệ nào. Nó là những dòng code hợp lệ dẫn đến đầu ra không chính xác bởi vì chúng ta đã bỏ qua một số tiểu tiết và kết quả trả về thực tế của tiểu tiết đó. Do đó, có thể coi gotchas là những lỗi thông thường khi code.

Bắt đầu với một vài ví dụ về Python 3 và xem xét gotchas gặp phải.

1. gotchas dấu ngoặc đơn:

Có một số lỗi phát sinh khi dấu ngoặc đơn được sử dụng không chính xác hoặc không cần thiết.

print(5>2 == True)  # results in False

Điều này dẫn đến False bởi vì biểu thức trên có nghĩa là 5>22== True. Điều này dẫn đến True and False và kết quả là False . Có thể sửa lỗi này với dấu ngoặc đơn.

print((5>2) == True) # results in True

Đây là một ví dụ khác:

print(5 is (not None)) # results in False

This is because "is not" is different from "is" and "not" being used separately. The part (not None) equals True and 5 is True results in False. It can be corrected by not using any parenthesis.
Điều này là do is not khác với isnot được sử dụng riêng. Phần not None trả về True5True sẽ trả về kết quả False. Chúng ta sẽ sửa nó bằng cách bỏ dấu ngoặc đơn đi.

print(5 is not None) # results in True

2. gotchas is, ==, is not, != :

Các toán tử so sánh được sử dụng rất nhiều, nhưng chúng cũng là những gotchas rất phổ biến. Rất nhiều lập trình viên mới thường nghĩ rằng là is== là so sánh những thứ giống nhau, nhưng chắc chắn là không.

print(1 == True) # results in True
print(1 is True) # results in False

Mặc khác, is not!= lại là như nhau.

print(1 != False) # results in True
print(1 is not False) # results in True

3. gotchas tham số mặc định:

Trong Python, các đối số mặc định chỉ được khai báo một lần khi hàm được chạy lần đầu tiên và từ đó trở đi, đối số đã khai báo được sử dụng mỗi lần.

def appendNew(appendTo =[]):      
    appendTo.append(1)   
    return appendTo

print(appendNew()) # [1]
print(appendNew()) # [1, 1]

Mỗi khi chúng ta gọi appendNew(), một danh sách mới sẽ được tạo, danh sách này sẽ có số 1 được thêm vào.
Biến appendTo không được tạo lại khi chạy hàm lần thứ hai. Thay vào đó, nó chỉ được tạo ra lần đầu tiên và được sử dụng nhiều lần. Có thể giải quyết nó bằng cách:

def appendNew(appendTo = None):  
    if appendTo == None:
        appendTo =[]    
    appendTo.append(1)   
    return appendTo

print(appendNew()) # [1]
print(appendNew()) # [1]

4. gotchas phạm vi:

Đôi khi, chúng ta phải ghi nhớ phạm vi của biến mà chúng ta đang xử lý, tức là nó là phạm vi toàn cục (hoạt động nhưng bên trong và bên ngoài một hàm) hay phạm vi cục bộ (chỉ hoạt động bên trong hàm).

list1 = [1, 2, 3]
def baz1():
    list1.append(4) 
    return list1
def baz2():
    list1 += [5]      
    return list1

print(baz1()) # [1, 2, 3, 4]
print(baz2()) # Error

baz2() chúng ta đang gán cho biến list1 nhưng list1 được xác định bên ngoài phạm vi chức năng của chúng ta. Trong khi ở trong baz1(), vậy nên thêm vào list1 thay vì gán và do đó nó hoạt động tốt.

5. gotchas late binding:

Python có một "late binding behavior" (hành vi ở thời điểm thực thi).

def create_multipliers():
    return [lambda c : i * c for i in range(6)] 
  
for multiplier in create_multipliers():
    print multiplier(3)

Kết quả mong đợi:

0
3
6
9
12
15

Nhưng kết quả thực tế:

15
15
15
15
15
15

Điều này là do khi vòng lặp hoàn thành, i có giá trị là 5, vì thế 5*3 sẽ được in ra 6 lần khi vòng lặp kết thúc. Có thể giải quyết như sau:

def create_multipliers():
    return [lambda x, i = i : i * x for i in range(6)]
      
for multiplier in create_multipliers():
    print(multiplier(3))

Kết

Trên đây là một vài ví dụ điển hình về gotchas trong python mà các lập trình viên mới thường xuyên gặp phải.

Bài viết của một người mới tập code python và hướng tới những người mới, không thể trách khỏi sai sót. Điều gì chưa chính xác xin vui lòng bỏ qua.

Nguồn: https://docs.python-guide.org/writing/gotchas // https://www.geeksforgeeks.org/gotchas-in-python/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí