2.2. ตัวแปรและชนิดข้อมูลพื้นฐาน¶
ตัวแปร คือชื่อที่คุณผูกกับค่าโดยใช้ตัวดำเนินการ = หลังการกำหนดค่า ชื่อนั้นสามารถใช้ได้ทุกที่ที่ค่าสามารถใช้ได้:
width = 320
height = 240
pixels = width * height
print(pixels) # prints 76800
ด้านขวาของ = จะถูกประเมินก่อน จากนั้นผลลัพธ์จะถูกผูกกับชื่อทางด้านซ้าย การอ่านชื่อที่ไม่เคยกำหนดค่าจะเกิด NameError
ตัวแปรเป็นเพียงป้ายกำกับ มันชี้ไปที่ค่า -- ค่าอยู่ที่อื่น และค่าเดียวกันสามารถมีป้ายกำกับได้จำนวนเท่าใดก็ได้
ตัวแปรเป็นป้ายกำกับที่ชี้ไปยังค่า การกำหนดค่าใหม่ให้ตัวแปรจะเลื่อนป้ายกำกับ ไม่เปลี่ยนค่าที่ป้ายกำกับเดิมชี้อยู่¶
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,-7Hex (0x1A), octal (0o17) และ binary (0b1010) literal ก็ใช้ได้และมีประโยชน์สำหรับรีจิสเตอร์และ bitmaskfloat -- ตัวเลขที่มีจุดทศนิยมหรือเลขชี้กำลัง:
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 ค่าใดอย่างชัดเจนจะ returnNoneโดยนัย
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 ชี้อยู่ ดังนั้นชื่ออื่นๆ ทุกชื่อที่ชี้ไปยังค่าเดียวกันนั้นจะเห็นการเปลี่ยนแปลง