การสร้างและประกาศตัวแปร
ตัวแปร (Variable) นั่นก็คือค่าที่สามารถเปลี่ยนแปลงได้ตลอดเวลา และสามารถเรียกดู และเอาไปทำอะไรที่น้องอยากทำได้หมดเลย จะเก็บตู้เย็นก็ยังได้ครับ (ถ้าน้องเอาตู้เย็นเข้า Python ได้อ่ะนะ)
น้องจำเป็นที่จะต้องประกาศตัวแปร เพื่อจะไปรับค่าที่น้องกำลังเอาเข้ามา หรือว่าผลลัพท์จากการทำอะไรซักอย่าง หรืออยากเก็บข้อมูลอะไรไว้ตั้งแต่แรก
การประกาศก็เพียงเขียนชื่อตัวแปร และก็ตามด้วยเครื่องหมายเท่ากับ (=) ครับ
โดยตัวแปรนั้นมีหน้าที่จัดเก็บข้อมูลครับ เช่นถ้าพี่บอกว่า
- สีที่พี่ชอบคือสีเขียว
- บ้านพี่อยู่คุมะโมโตะ
หากว่าน้องเขียนเป็นภาษาโค้ด (หรือในที่นี้คือ Python) ก็จะได้แบบนี้ครับ
my_favorite_color = "Green"
my_hometown = "Kumamoto"
ทำให้เวลาพี่ได้ถามว่า "บ้านพี่อยู่ที่ไหน" ก็จะได้คำตอบว่าคุมะโมโตะ
น้องๆที่เคยเขียนโปรแกรมภาษาอื่น ก็จะเรื่มสงสัยว่า พี่ไม่ต้องไปบอกว่าให้เก็บประเภทข้อมูล (Data Type) อะไรเลยเหรอ พี่มงก็จะตอบว่า ไม่ต้องครับ
สำหรับน้องๆที่เคยเรียนภาษาอื่นๆมาแล้ว
อย่าเพื่งข้าม lecture นี้ไปนะครับ เพราะหลักการเขียนตัวแปรไม่เหมือนกันกับภาษาอื่นๆซะเท่าไหร่
หลักการตั้งชื่อตัวแปร
ตามหลัก Python Coding Standard (PIP8) แล้ว ตัวแปรของน้องๆควรที่จะ
- ห้ามใช้ตัวเลขหรือตัวอักษรพิเศษ อย่างโดดๆ (เช่น 'a')
- ชื่อตัวแปรสามารถระบุได้ว่าข้อมูลนั้นคืออะไร (เช่น
address
สำหรับการเก็บค่าที่อยู่) - ใช้
snake_case
(นั่นก็คือการใช้ตัวอักษรภาษาอังกฤษเป็นตัวเล็กทั้งหมด และใช้ underscore_
) - หากใช้ชื่อตัวแปรซ้ำ อาจจะทำให้ Python ไม่รู้ว่าจะเลือกตัวแปรไหน (ซึ่งจะเรียกของ Local ก่อน)
แต่ในตัวเช็คใน EJudge นั้นก็ยังต้องการ
- ความยาวตัวแปรอย่างน้อย 4 ตัวอักษร
- ไม่เอาตัวแปรแบบไม่มีความหมายใดๆ (เช่น
aaaa
หรือabcd
)
การเขียนตัวแปรเป็นระเบียบจะทำให้น้องๆ สามารถย้อนไปอ่านโค้ดของตัวเองได้อย่างสะดวก และแก้ไขการทำงานผิดพลาดได้เร็วขึ้นอีกด้วย รวมไปถึงผู้อื่นที่อาจจะต้องเอาโค้ดของน้องไปใช้งานหรือเพื่ออ่านทำความเข้าใจ
การจัดเก็บข้อมูลในตัวแปร
พี่มงจะใช้ตัวอย่างนี้สำหรับการอธิบายการให้ค่ากับตัวแปรนะครับ
### Basic value declaration
first_name = "Kumamon"
middle_name = 'M'
age = 21
ใน first_name = "Kumamon"
จึงหมายความว่า ให้เก็บ คำ ไว้ที่ตัวแปร first_name
นั่นเอง
ทำให้พอตัวแปรถูกเรียกใช้งาน ก็จะได้ค่าออกมาเป็น "Kumamon" นั่นเองครับ
ใน middle_name = 'M'
พี่ได้เลือกใช้ ' เพื่อแสดงถึงความเป็นตัวอักษรอันเดียว แต่ในระดับน้องๆแล้ว จะใช้ ""
หรือ ''
ก็ได้เหมือนกันครับ
เช่นเดียวกันกับ age
แต่อันนี้แตกต่างกันเพราะว่าเป็นตัวเลข เลยไม่ต้องใช้ ""
ครอบเพื่อบ่งบอกความเป็นตัวอักษร
main_address, secondary_address = "Kumamoto, Japan", "Bangkok, Thailand"
คือการย่อบรรทัดของการประกาศตัวแปร main_address = "Kumamoto, Japan"
และ secondary_address = "Bangkok, Thailand"
นั่นแหละครับ แต่พี่เพียงเอาไปย่อมาเป็นบรรทัดเดียวกันเฉยๆ
พี่ยังแนะนำให้น้องประกาศเก็บตัวแปรทีละบรรทัดนะครับ เดี๋ยวน้องจะงงกัน
lifespan = 70 - age
คือการเอาตัวแปร age
มาทำการลบด้วย 70 ก่อน และผลลัพท์ก็จะถูกเอาไปใส่ในตัวแปร lifespan
ครับ
ข้อสังเกต
การเขียนภาษา Python นั้น น้องๆไม่จำเป็นที่จะต้องบอกว่าตัวแปรนั้นเป็นประเภทอะไรนะครับ แค่เอาข้อมูลมันมาเก็บ มันก็จะเดาให้เองเลยครับ ว่าเป็นประเภทไหน
การเขียนทับข้อมูลในตัวแปร
หลังจากน้องๆเข้าใจตัวแปรเรียบร้อยแล้ว ก็จะมาเรียนกันว่า ถ้่าอยากเปลี่ยนใจ เปลี่ยนค่าในตัวแปรได้หรือเปล่า
พี้ก็จะขอใช้โค้ดด้านล่าง เพื่ออธิบายหลังการนะครับ
first_name = "Kuma"
middle_name = "M."
last_name = "mon"
# Change first_name to "Python"
first_name = "Python"
# Change first_name to Integer, valued 21
first_name = 21
# Equal last_name as first_name
last_name = first_name
# Equal first_name and last_name as middle_name
first_name = last_name = middle_name
ตัวแปรระดับ Global
โดยตัวแปรแบบ Local นั้นจะสามารถ เข้าถึงได้เมื่ออยู่ใน Function เดียวกันเท่านั้น
หากเราทำการตั้งชื่อตัวแปรชื่อเดียวกันใน Function คนละอันกัน ก็จะไม่มีการยุ่งเกี่ยวต่อกัน สามารถทำงานพร้อมกันได้โดยไม่มีการเขียนทับ
แต่สำหรับตัวแปรแบบ Global แล้ว มันก็คือการบอกให้ตัวแปรนั้นสามารถเกี่ยวข้องกับใน Function ได้
พี่จะใช้โค้ดนี้เพื่ออธิบายเรื่อง Locals กับ Globals นะครับ
CONSTANT = 36
def add(value_a, value_b):
return value_a + value_b + CONSTANT
def subtract(value_a, value_b):
return value_a - value_b - CONSTANT
add_result = add(12, 24)
subtract_result = subtract(24, 12)
print(add_result)
print(subtract_result)
CONSTANT = 10
add_result = add(12, 24)
print(add_result)
หากรันโปรแกรมแล้ว ก็จะได้ผลลัพท์ตามนี้ครับ
72
12
46
ตรวจสอบประเภทตัวแปร
ถ้าพี่อยากที่จะรู้ว่าตัวแปรไหน มีค่าเท่าไหร่แล้ว น้องๆก็จะตอบกลับมาว่า "ใช้ print() ตัวแปรออกมาสิพี่" มันก็ถูกของน้องอ่ะนะ
แต่วันนี้ พี่ก็จะขอเสนอฟังก์ชั่น (แบบ built-in) ที่ชื่อ locals()
และ globals()
ครับ
และเพื่อที่จะให้น้องๆดูได้ว่า ตัวแปรนี้มีค่าเท่ากับเท่าไหร่ ก็สามารถเรียก
globals()
เพื่อดูตัวแปรแบบ Globallocals()
เพื่อดูตัวแปรแบบ Local
โดยจะโยนผลลัพท์ออกมาเป็นข้อมูลประเภท Dictionary ครับ
และ dir()
เพื่อดูว่าในระบบมีตัวแปรอะไรบ้าง
(แต่ไม่บอกว่ามีค่าเท่ากับเท่าไหร่นะครับ ต้องใช้ globals()
หรือ locals()
เท่านั้นครับ)
วิธีการใช้งานฟังก์ชั่น globals()
ก็ให้น้องใส่ globals()
ไปที่จุดที่น้องต้องการดูค่าในตัวแปรครับ เช่น
# พี่ประกาศและให้ค่าตัวแปรก่อนเนอะ
FIRST_NAME = "Kumamon"
MIDDLE_NAME = 'M'
AGE = 21
# และทำการเรียกฟังก์ชั่น globals() เพื่อดูค่าในตัวแปร
globals()
พี่ก็จะเอาผลลัพท์ออกมาแผ่ให้น้องดูแล้วกันนะครับ
{
'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None,
'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'FIRST_NAME': 'Kumamon',
'MIDDLE_NAME': 'M',
'AGE': 21
}
แต่ที่น้องๆต้องสนใจ อยู่ในบรรทัดที่ 9 ถึง 11 ครับ ซึ่งพี่ได้ highlight ไว้ให้แล้ว
หากน้องๆอ่านไฟล์ JSON เป็นก็จะเข้าใจเลยเนอะ อิอิ หากไม่เป็นก็ไม่เป็นไรเนอะ
ก็คือ ฝั่งซ้ายคือชื่อตัวแปร และฝั่งขวาคือค่าที่ถูกจัดเก็บครับ
ในตัวอย่างนี้ ค่า first_name
นั้นมีค่าเท่ากับ 'Kumamon'
ประมาณนี้แหละครับ
ข้อดีของการทำแบบนี้ ทำให้น้องไม่ต้องไป print()
ตัวแปรให้เหนื่อยครับ เรียกทีเดียว ได้ค่าทั้งหมดเลย
TIP
globals() พี่แนะนำให้เอาไว้ใช้ในกรณีที่น้องทำ debug เท่านั้นนะครับ
ไม่แนะนำว่าให้ไปใช้อันนี้ในการส่งคำตอบหรือว่าเอาไปทำอะไรแปลกๆนะครับ