2.2. Biến và các kiểu dữ liệu cơ bản¶
Một biến là tên bạn gán cho một giá trị bằng toán tử =. Sau khi gán, tên đó có thể được sử dụng ở bất kỳ đâu mà giá trị có thể:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
Phía bên phải của = được đánh giá trước, sau đó kết quả được gán cho tên ở bên trái. Đọc một tên chưa bao giờ được gán sẽ sinh ra NameError.
Một biến chỉ là một nhãn. Nó trỏ đến một giá trị -- giá trị nằm ở nơi khác, và cùng một giá trị có thể có bất kỳ số lượng nhãn nào.
Biến là các nhãn trỏ đến các giá trị. Gán lại một biến di chuyển nhãn; nó không thay đổi giá trị mà nhãn đó từng trỏ đến.¶
2.2.1. Quy tắc đặt tên¶
Tên bắt đầu bằng chữ cái hoặc dấu gạch dưới và có thể chứa chữ cái, chữ số và dấu gạch dưới.
frame_countvà_internallà hợp lệ;1st_framelà lỗi cú pháp.Tên phân biệt chữ hoa và thường:
Widthvàwidthlà hai biến khác nhau.Tránh tái sử dụng các tên dựng sẵn như
list,str,id(), hoặcprint()-- che khuất chúng không gây ra lỗi, nhưng phần tử dựng sẵn gốc trở nên không thể truy cập trong phần còn lại của tập lệnh.Quy ước:
snake_casecho biến và hàm,ALL_CAPScho hằng số bạn không có ý định thay đổi,CamelCasecho tên lớp.
2.2.2. Các kiểu dữ liệu cơ bản¶
Mỗi giá trị trong Python có một kiểu xác định các phép toán nó hỗ trợ. Bốn kiểu bạn sẽ viết nhiều nhất là:
int -- số nguyên, dương hoặc âm. Số nguyên MicroPython lớn tùy theo bộ nhớ cho phép. Literal được viết dưới dạng các chữ số đơn thuần:
0,42,-7. Literal hex (0x1A), bát phân (0o17) và nhị phân (0b1010) cũng hợp lệ và hữu ích cho thanh ghi và bitmask.float -- số có dấu thập phân hoặc số mũ:
3.14,1.0,-0.5,2e6(= 2.000.000,0). Tất cả float trên camera đều là IEEE 754 32-bit -- chính xác đến khoảng bảy chữ số có nghĩa.bool -- một trong hai literal
TruehoặcFalse(lưu ý viết hoa).str -- văn bản, viết là các ký tự giữa dấu nháy đơn hoặc kép:
"hello",'OpenMV'. Cả hai kiểu nháy đều tương đương; chọn loại nào cho phép bạn tránh thoát các ký tự nháy xuất hiện bên trong chuỗi.
Có thêm một giá trị thứ năm đáng biết ngay lập tức:
None -- giá trị duy nhất của kiểu
NoneType. Được dùng để có nghĩa là "không có giá trị" hoặc "chưa được đặt". Các hàm không trả về bất cứ thứ gì một cách tường minh sẽ ngầm trả vềNone.
2.2.3. Kiểm tra và chuyển đổi kiểu¶
Hàm dựng sẵn type() trả về kiểu của bất kỳ giá trị nào:
>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>
Mỗi kiểu cũng hoạt động như một hàm chuyển đổi. Truyền vào một giá trị thuộc kiểu khác và bạn nhận lại giá trị tương đương của kiểu mới -- khi việc chuyển đổi được xác định rõ ràng:
>>> int("42")
42
>>> int(3.9)
3 # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)
Các chuyển đổi không được xác định rõ ràng sẽ sinh ra ValueError:
>>> int("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10
2.2.4. Gán lại và kiểu động¶
Một tên có thể được gán lại cho một giá trị thuộc bất kỳ kiểu nào bất kỳ lúc nào. Đoạn sau đây là hợp lệ:
x = 42
x = "now I'm a string"
x = 3.14
Python không ràng buộc một biến với một kiểu. Mã phụ thuộc vào x là số nguyên đơn giản chỉ mong đợi một số nguyên tại điểm sử dụng nó; nếu nó nhận được thứ gì đó khác, bạn sẽ nhận được TypeError lúc chạy.
Ghi chú
Gán lại x không thay đổi giá trị mà ràng buộc cũ trỏ đến. Nếu hai tên cùng chia sẻ một giá trị, việc gán lại một tên không ảnh hưởng đến tên kia:
a = [1, 2, 3]
b = a # both point at the same list
a = "different now"
print(b) # still [1, 2, 3]
Thay đổi một giá trị được chia sẻ là khác biệt: một phương thức như list.append thay đổi giá trị mà ràng buộc trỏ đến, vì vậy mọi tên khác trỏ đến cùng giá trị đó đều thấy sự thay đổi.