การสร้างและประกาศตัวแปร

ตัวแปร (Variable) นั่นก็คือค่าที่สามารถเปลี่ยนแปลงได้ตลอดเวลา และสามารถเรียกดู​ และเอาไปทำอะไรที่น้องอยากทำได้หมดเลย จะเก็บตู้เย็นก็ยังได้ครับ (ถ้าน้องเอาตู้เย็นเข้า Python ได้อ่ะนะ)

น้องจำเป็นที่จะต้องประกาศตัวแปร เพื่อจะไปรับค่าที่น้องกำลังเอาเข้ามา หรือว่าผลลัพท์จากการทำอะไรซักอย่าง หรืออยากเก็บข้อมูลอะไรไว้ตั้งแต่แรก

การประกาศก็เพียงเขียนชื่อตัวแปร และก็ตามด้วยเครื่องหมายเท่ากับ (=) ครับ

โดยตัวแปรนั้นมีหน้าที่จัดเก็บข้อมูลครับ เช่นถ้าพี่บอกว่า

  • สีที่พี่ชอบคือสีเขียว
  • บ้านพี่อยู่คุมะโมโตะ

หากว่าน้องเขียนเป็นภาษาโค้ด (หรือในที่นี้คือ Python) ก็จะได้แบบนี้ครับ

  • my_favorite_color = "Green"
  • my_hometown = "Kumamoto"

ทำให้เวลาพี่ได้ถามว่า "บ้านพี่อยู่ที่ไหน" ก็จะได้คำตอบว่าคุมะโมโตะ

น้องๆที่เคยเขียนโปรแกรมภาษาอื่น ก็จะเรื่มสงสัยว่า พี่ไม่ต้องไปบอกว่าให้เก็บประเภทข้อมูล (Data Type) อะไรเลยเหรอ พี่มงก็จะตอบว่า ไม่ต้องครับ

สำหรับน้องๆที่เคยเรียนภาษาอื่นๆมาแล้ว

อย่าเพื่งข้าม lecture นี้ไปนะครับ เพราะหลักการเขียนตัวแปรไม่เหมือนกันกับภาษาอื่นๆซะเท่าไหร่

หลักการตั้งชื่อตัวแปร

ตามหลัก Python Coding Standard (PIP8)open in new window แล้ว ตัวแปรของน้องๆควรที่จะ

  • ห้ามใช้ตัวเลขหรือตัวอักษรพิเศษ​ อย่างโดดๆ (เช่น '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() เพื่อดูตัวแปรแบบ Global
  • locals() เพื่อดูตัวแปรแบบ 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 เท่านั้นนะครับ
ไม่แนะนำว่าให้ไปใช้อันนี้ในการส่งคำตอบหรือว่าเอาไปทำอะไรแปลกๆนะครับ