ตัวแปร

เนื่องจากไพธอนเป็นภาษาสคริปต์จึงไม่เน้นชนิดของตัวแปร การไม่เน้นไม่ได้หมายความว่าตัวแปรในไพธอนไม่มีชนิด ในความจริงแล้วตัวแปรถ้าพูดแบบละเอียดชนิดของตัวแปรในไพธอนมีเพียงชนิดเดียว นั่นก็คือ พอยเตอร์ (Pointer) นั่นเอง สำหรับผู้ที่เคยมีประสบการณ์เขียนโปรแกรมด้วยภาษาระดับกลางถึงต่ำเช่น ปาสคาล หรือซี เป็นต้น คำว่าพอยเตอร์อาจทำให้ขยาด แต่ในไพธอนแล้วพอยเตอร์เป็นเรื่องธรรมชาติที่เข้าใจได้ง่ายกว่ามาก เพราะไม่มีสัญลักษณ์และรูปแบบที่หลากหลายรวมถึงตัวแปรทุกตัวถือว่าเป็นพอยเตอร์อยู่แล้วจึงไม่สับสนกับชนิดของตัวแปร

แต่เอ๊ะ แล้วทำไมตัวแปรถึงไม่มีชนิดตามข้อมูลล่ะ ง่ายนิดเดียวครับ เพราะตัวแปรเป็นพอยเตอร์ที่เอาไว้ชี้ข้อมูลจริงๆ นั่นเอง เมื่อถึงเวลาใช้แล้วนั้น ตัวแปรจะมีชนิดเปลี่ยนไปตามข้อมูลที่กำลังชี้อยู่ ด้วยเหตุนี้เองทำให้ตัวแปรของไพธอนไม่มีชนิดที่แน่นอนตายตัว ทำให้กลายเป็นทั้งข้อดีและข้อเสียในเวลาเดียวกัน ข้อดีได้แก่

  1. สะดวก ประหยัด
  2. เปลี่ยนชนิดของตัวแปรระหว่างการทำงานได้

ในขณะที่ข้อเสีย เช่น

  1. ไม่สามารถตรวจสอบความถูกต้องได้จนกว่าจะใช้งานจริง
  2. ไม่สามารถรู้ชนิดของตัวแปรจนกว่าจะใช้งานจริง

อย่างไรก็ตาม แม้ว่าตัวแปรของไพธอนจะไม่ต้องกำหนดชนิดที่แน่นอน แต่ตัวแปรจะต้องถูกกำหนดค่าก่อนนำไปใช้เสมอ การกำหนดค่าครั้งแรกถือว่าเป็นการประกาศตัวแปรนั้นขึ้นมาใช้งานทันที เช่น

print a 
a = 1

ตัวอย่างด้านบนไม่สามารถทำงานได้เพราะ a ยังไม่ถูกประกาศก่อนการใช้งานในบรรทัดแรก ทำให้โปรแกรมเกิดข้อผิดพลาดและหยุดทำงานทันที ตัวอย่างถัดไปเป็นตัวอย่างที่ถูกต้อง

a = 1 
print a 
a = 1.0 
print a 
a = 'abc'
print a

ตัวอย่างตัวแปรตามชนิดข้อมูล

ว่ากันตามจริงแล้วตัวแปรในไพธอนใช้เหมือนกันหมดไม่มีข้อยกเว้นกรณีพิเศษใดๆ สิ่งที่แตกต่างไปของวิธีใช้ขึ้นกับชนิดข้อมูลของตัวแปรนั้นมากกว่า เพราะไพธอนเป็นภาษาที่อิงการเขียนโปรแกรมเชิงวัตถุ ด้วยเหตุนี้ตัวแปรที่ชี้ไปยังข้อมูลเหล่านี้จึงมีสภาพคล้ายกับอ๊อบเจ็กแต่ไม่ใช่อ๊อบเจ็ก อย่างไรก็ตามการคิดว่าชนิดข้อมูลเป็นอ๊อบเจ็กแบบพิเศษก็ไม่ผิดอะไรนัก แต่ชนิดข้อมูลพื้นฐานส่วนใหญ่ไม่มีเมธอดพิเศษเหมือนภาษาอื่น โดยเฉพาะอย่างยิ่งตรรกะและตัวเลข เมธอดที่ใช้บ่อยมักเกี่ยวกับลำดับ และจับคู่ ตอนนี้เราก็จะมาว่ากันด้วยเรื่องของเมธอดที่ควรรู้กันทีละชุด

สตริง เป็นชนิดข้อมูลที่ใช้บ่อยมากๆ ส่วนใหญ่การทำงานกับสตริงจะเป็นเรื่องของค้นหาคำ find() เปลี่ยนคำ replace() ตัวเล็ก lower() ตัวใหญ่ upper() แยกคำ split() เป็นต้น นอกนั้นนี้ก็จะเป็นดึงตัวอักษรบางส่วนออกมาจากสตริง

s = 'Ab,Cd,Ef'
print s.find('d')
print s.find('D')
print s.replace('Cd','Gh')
print s.lower()
print s.upper()
print s.split()
print s.split(',')

โค้ดด้านบนจะได้ผลลัพธ์ดังด้านล่าง

4
-1
Ab,Gh,Ef
ab,cd,ef
AB,GH,EF 
['A','b',',','C','d',',','E','f'] 
['Ab','Cd','Ef']

ลิสต์ เป็นชนิดข้อมูลสารพัดประโยชน์ ได้ใช้ทั้งแบบคิว และสแตก สามารถเรียงข้อมูลได้ด้วยตัวเอง แทรกข้อมูลได้

l = [1,2,3,4] 
print l 
l.append(5) 
print l 
l.append(1) 
print l 
print l.count(1),l.count(2) 
l.extend([5,6,7]) 
print l 
l.insert(5,8) 
print l 
print l.pop() 
print l 
l.remove(5) 
print l 
l.reverse() 
print l 
l.sort() 
print l

ผลลัพธ์จะเป็นดังด้านล่าง

[1, 2, 3, 4] 
[1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5, 1] 
2 1 
[1, 2, 3, 4, 5, 1, 5, 6, 7] 
[1, 2, 3, 4, 5, 8, 1, 5, 6, 7] 
7 
[1, 2, 3, 4, 5, 8, 1, 5, 6] 
[1, 2, 3, 4, 8, 1, 5, 6] 
[6, 5, 1, 8, 4, 3, 2, 1] 
[1, 1, 2, 3, 4, 5, 6, 8]

ดิกชั่นนารี เป็นชนิดข้อมูลสารพัดประโยชน์เช่นกัน เพราะใช้ง่าย สะดวก ไม่ต้องเขียนคลาสเพิ่ม สามารถเข้าถึงข้อมูลภายในได้ด้วยข้อมูลชนิดใดก็ได้

d = {'a': 1, 'b': 2, 'c': 3} 
print d 
print d.items() 
print d.keys() 
print d.values()

ตัวอย่างด้านบนจะให้ผลดังนี้

{'a': 1, 'c': 3, 'b': 2} 
[('a', 1), ('c', 3), ('b', 2)]
['a', 'c', 'b'] 
[1, 3, 2]