2.2. ตัวแปรและชนิดข้อมูลพื้นฐาน

ตัวแปร คือชื่อที่คุณผูกกับค่าโดยใช้ตัวดำเนินการ = หลังการกำหนดค่า ชื่อนั้นสามารถใช้ได้ทุกที่ที่ค่าสามารถใช้ได้:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

ด้านขวาของ = จะถูกประเมินก่อน จากนั้นผลลัพธ์จะถูกผูกกับชื่อทางด้านซ้าย การอ่านชื่อที่ไม่เคยกำหนดค่าจะเกิด NameError

ตัวแปรเป็นเพียงป้ายกำกับ มันชี้ไปที่ค่า -- ค่าอยู่ที่อื่น และค่าเดียวกันสามารถมีป้ายกำกับได้จำนวนเท่าใดก็ได้

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

ตัวแปรเป็นป้ายกำกับที่ชี้ไปยังค่า การกำหนดค่าใหม่ให้ตัวแปรจะเลื่อนป้ายกำกับ ไม่เปลี่ยนค่าที่ป้ายกำกับเดิมชี้อยู่

2.2.1. กฎการตั้งชื่อ

  • ชื่อเริ่มต้นด้วยตัวอักษรหรือขีดล่างและอาจมีตัวอักษร ตัวเลข และขีดล่าง frame_count และ _internal ใช้ได้; 1st_frame เป็นข้อผิดพลาดทางไวยากรณ์

  • ชื่อแยกตัวพิมพ์ใหญ่-เล็ก: Width และ width เป็นสองตัวแปรที่แตกต่างกัน

  • หลีกเลี่ยงการใช้ชื่อในตัวซ้ำ เช่น list, str, id() หรือ print() -- การ shadow ชื่อเหล่านั้นไม่เกิดข้อผิดพลาด แต่ฟังก์ชันในตัวเดิมจะเข้าไม่ถึงได้ตลอดส่วนที่เหลือของสคริปต์

  • แบบแผน: snake_case สำหรับตัวแปรและฟังก์ชัน, ALL_CAPS สำหรับค่าคงที่ที่ไม่ตั้งใจจะเปลี่ยน, CamelCase สำหรับชื่อคลาส

2.2.2. ชนิดข้อมูลพื้นฐาน

ทุกค่าใน Python มี ชนิด ที่กำหนดการดำเนินการที่รองรับ ชนิดสี่ประเภทที่คุณจะเขียนบ่อยที่สุดคือ:

  • int -- จำนวนเต็ม บวกหรือลบ MicroPython integer เติบโตได้มากเท่าที่หน่วยความจำอนุญาต Literal เขียนเป็นตัวเลขธรรมดา: 0, 42, -7 Hex (0x1A), octal (0o17) และ binary (0b1010) literal ก็ใช้ได้และมีประโยชน์สำหรับรีจิสเตอร์และ bitmask

  • float -- ตัวเลขที่มีจุดทศนิยมหรือเลขชี้กำลัง: 3.14, 1.0, -0.5, 2e6 (= 2,000,000.0) float ทั้งหมดบนกล้องเป็น IEEE 754 32-bit -- แม่นยำประมาณเจ็ดหลักนัยสำคัญ

  • bool -- หนึ่งในสอง literal True หรือ False (สังเกตการใช้ตัวพิมพ์ใหญ่)

  • str -- ข้อความ เขียนเป็นอักขระระหว่างเครื่องหมายคำพูดเดี่ยวหรือคู่: "hello", 'OpenMV' ทั้งสองสไตล์เครื่องหมายคำพูดเทียบเท่ากัน เลือกอันที่ช่วยให้หลีกเลี่ยงการ escape อักขระเครื่องหมายคำพูดที่ปรากฏภายใน string

ยังมีค่าที่ห้าที่ควรรู้ทันที:

  • None -- ค่าเดียวของชนิด NoneType ใช้เพื่อหมายความว่า "ไม่มีค่า" หรือ "ยังไม่ได้ตั้งค่า" ฟังก์ชันที่ไม่ได้ return ค่าใดอย่างชัดเจนจะ return None โดยนัย

2.2.3. การตรวจสอบและแปลงชนิดข้อมูล

ฟังก์ชันในตัว type() คืนชนิดของค่าใดๆ:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

ชนิดแต่ละประเภทยังทำหน้าที่เป็นฟังก์ชันแปลงค่าด้วย ส่งค่าของชนิดอื่นให้มัน แล้วคุณจะได้ค่าเทียบเท่าของชนิดใหม่กลับมา -- เมื่อการแปลงมีความหมายชัดเจน:

>>> 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)

การแปลงที่ไม่มีความหมายชัดเจนจะเกิด 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. การกำหนดค่าใหม่และการกำหนดชนิดแบบไดนามิก

ชื่อสามารถถูกกำหนดค่าใหม่เป็นค่าชนิดใดก็ได้ตลอดเวลา ดังต่อไปนี้ถูกกฎหมาย:

x = 42
x = "now I'm a string"
x = 3.14

Python ไม่ผูกตัวแปรกับชนิด โค้ดที่ขึ้นอยู่กับ x ที่เป็น integer เพียงแค่คาดหวัง integer ที่จุดที่มันใช้; หากได้สิ่งอื่น จะเกิด TypeError ขณะรันไทม์

Note

การกำหนดค่าใหม่ให้ x ไม่ เปลี่ยนค่าที่ binding เดิมชี้อยู่ หากสองชื่อแบ่งปันค่าเดียวกัน การกำหนดค่าใหม่ให้ชื่อหนึ่งจะไม่ส่งผลต่ออีกชื่อ:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

การ mutate ค่าที่แบ่งปันนั้นแตกต่างกัน: เมธอดเช่น list.append เปลี่ยนค่าที่ binding ชี้อยู่ ดังนั้นชื่ออื่นๆ ทุกชื่อที่ชี้ไปยังค่าเดียวกันนั้นจะเห็นการเปลี่ยนแปลง