ตัวแปร คำสั่ง การทดสอบ
ตัวแปรคืออะไร?
ตัวแปร (Variable) คือค่าที่มีหน้าที่ในการจัดเก็บข้อมูลที่เราต้องการ โดยค่านี้เราสามารถเรียกใช้และเปลี่ยนแปลงได้ ซึ่งเราจะเอาประโยชน์จากความสามารถในการเก็บข้อมูลและคืนค่าข้อมูล มาใช้ในการเขียนภาษาโปรแกรมมิ่งอย่าง Python กัน
วิธีการเก็บข้อมูลภายในตัวแปร
เพื่อทำการเก็บข้อมูลภายในตัวแปร ให้เราทำการตั้งชื่อค่าตัวแปร ตามด้วยเครื่องหมายเท่ากับ (=) พร้อมกับทำการระบุค่าที่เราต้องการเก็บ
text = "Hello World"
โดยในภาษา Python การพิมพ์ประโยคข้างต้นไปนั้นจะถือว่าเป็นการประกาศตัวแปร (Variable Declaration) และจัดเก็บค่าข้อมูลเป็นที่เรียบร้อยแล้ว
และนอกจากนี้เราก็ยังไม่จำเป็นที่จะต้องระบุประเภทตัวแปร (Data Type) อีกด้วย ทำให้ตัวแปรเดียวกันสามารถเก็บค่าอะไรก็ได้ตามที่ต้องการ ตัวอย่างเช่นเก็บค่าตัวเลข (Number) หรือค่าตัวอักษร (String/Character)
text = "Hello World"
age = 21
การประกาศหลายตัวแปรพร้อมกันในบรรทัดเดียว
ปกติ เราก็จะทำการเก็บตัวแปรกันเป็นในรูปแบบบรรทัดเดียวต่อหนึ่งตัวแปรดังนี้
main_address = "Kumamoto"
secondary_address = "Bangkok"
แต่ในภาษา Python น้อง ๆ สามารถทำการรวมบรรทัดให้กลายมาเป็นบรรทัดเดียวกันได้ดังนี้
main_address, secondary_address = "Kumamoto", "Bangkok"
คือการรวมบรรทัดของการประกาศตัวแปร main_address = "Kumamoto"
และ secondary_address = "Bangkok"
ด้วยการใช้เครื่องหมาย =
อันเดียวนั่นแหละครับ
หลักการตั้งชื่อตัวแปร
แม้ว่าเราจะสามารถตั้งชื่อตัวแปรเป็นอะไรก็ได้ แต่เมื่อเราทำงานกับผู้อื่น ก็จะทำให้โค้ดของเราไม่สื่อสารกับผู้อื่นเลย นักพัฒนา Python จึงทำการสร้างหลักมาตรฐานการเขียน Python (หรือ Python Coding Standard (PIP8)) เพื่อให้เราทำตาม
โดยคร่าว ๆ ก็จะมีหลักการในการตั้งชื่อตัวแปรดังนี้
- ชื่อตัวแปรทั่วไปและชื่อฟังก์ชัน ใช้
snake_case
หรือก็คือการใช้ตัวอักษรภาษาอังกฤษพิมพ์เล็ก (Lowercase) และใช้เครื่องหมาย_
(Underscore) ในการแบ่งคำ- การใช้แบบตัวแปร เช่น
index
,value
- การใช้แบบฟังก์ชัน เช่น
get_item()
- การใช้แบบตัวแปร เช่น
- ชื่อตัวแปรสามารถระบุได้ว่าข้อมูลนั้นจัดเก็บหรือมีหน้าที่อะไร
- เช่น
address
สำหรับการเก็บค่าที่อยู่ - หรือ
age
สำหรับการเก็บค่าอายุ - หรือ
index
สำหรับการเก็บตัวเลข index ภายในลูป
- เช่น
คำแนะนำในการตั้งชื่อตัวแปรเพิ่มเติม
- ระวังการใช้ชื่อตัวแปรโดยไม่มีมาตรฐานของตัวเอง เพราะอาจทำให้เราหรือผู้อิ่นสับสนแทนได้
- เช่นการใช้
fname
และตัวแปรชื่อfirst_name
สำหรับชื่อนำหน้า (First Name) และทำหน้าที่เหมือนกัน - หรือการใช้
sex
และgender
ในการเก็บข้อมูลเพศรูปแบบเดียวกัน
- เช่นการใช้
- หากเราใช้ชื่อตัวแปรเดิมซ้ำเพื่อเก็บข้อมูลใหม่ อาจทำให้ระบบไปดึงข้อมูลมาอย่างไม่ถูกต้องก็เป็นได้
- หากชื่อตัวแปรที่มีความแตกต่างเพียงเล็กน้อย อาจทำให้โค้ดทำงานผิดพลาดเนื่องจากเราทำการเรียกตัวแปรผิดตัว
ข้อห้ามในการตั้งชื่อตัวแปร
- ห้ามเริ่มชื่อตัวแปรด้วยตัวเลข
- ห้ามใช้ชื่อตัวแปรเหมือนชื่อฟังก์ชัน (ทั้งแบบ Built-in และเขียนเอง) เพราะอาจทำให้ฟังก์ชันนั้นถูกทับการทำงานด้วยข้อมูล
- ตัวแปรต้องมีความยาวมากกว่าหนึ่งตัวอักษร เพราะหนึ่งตัวอักษรนั้นจะถูกสงวนเอาไว้ใช้กับตัวแปรแบบใช้แล้วทิ้ง
- (สำหรับระบบ E-Judge) ความยาวตัวแปรอย่างน้อย 4 ตัวอักษร
การเขียนทับข้อมูลในตัวแปร
โดยตัวแปรเองนอกจากจะเก็บข้อมูลได้แล้ว ก็ยังสามารถนำเอาไปใช้และเปลี่ยนข้อมูลได้อีกด้วย ตัวอย่างเช่นว่าเราเก็บข้อมูล text
เอาไว้เป็น "Hello World"
text = "Hello World"
ถ้าเราอยากจะเปลี่ยนค่าก็สามารถเขียนทับได้เลยดังนี้ ทำให้ในเวลานี้ตัวแปร text นั้นมีค่าเท่ากับ "Hello from the other side"
text = "Hello from the other side"
หรือเราจะเปลี่ยนประเภทตัวแปรไปเลยก็ได้เช่นกันครับ และตัวแปรนั้นก็จะมีการแปลงประเภทตัวแปรไปเป็น Boolean (ค่าความจริง) เป็นที่เรียบร้อย
text = True
ขอบเขตตัวแปร (Variable Scope)
- ตัวแปรระดับ Global (Global Variable)
- ตัวแปรแบบ Local (Local Variable)
เกี่ยวกับ Local Variable
def function_1():
text = "Hello"
print(text)
def function_2():
text = "World"
print(text)
def function_3():
text = "everyone"
print(text)
function_1()
function_2()
function_3()
เกี่ยวกับ Global Variable
โดยตัวแปรแบบ 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
result = add(12, 24)
print(result)
หากรันโปรแกรมแล้ว ก็จะได้ผลลัพท์ตามนี้ครับ
72
วิธีตรวจสอบประเภทตัวแปร
ถ้าพี่อยากที่จะรู้ว่าตัวแปรไหน มีค่าเท่าไหร่แล้ว น้องๆก็จะตอบกลับมาว่า "ใช้ 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 เท่านั้นนะครับ
ไม่แนะนำว่าให้ไปใช้อันนี้ในการส่งคำตอบหรือว่าเอาไปทำอะไรแปลกๆนะครับ