String Array

Python นั้น จะเก็บข้อมูล String ไว้ในแบบ Array หรือว่าลัง (ถ้าจะให้เข้าใจง่ายๆ) โดยลังๆนึง มี character อยู่หนึ่งตัว (นั่นก็คือกล่อง)

และ โกดังคือตัวแปรที่เก็บข้อมูล String ที่มีหน้าที่เก็บลังนั่นเอง
แต่ว่าโกดังอันนี้สามารถยืดหดขนาดได้ครับ ทำให้เก็บข้อมูลได้เยอะแยะเต็มไปหมดเลย
โดยผู้จัดการขนาดโกดังก็คือตัว Python นั่นเอง ดังนั้นน้องๆเลยไม่ต้องสนใจเรื่องการเปลี่ยนขนาดโกดัง เหมือนหลายๆ ภาษาคอมพิวเตอร์ครับ

อ่ะ เรามาเข้าเรื่องเกี่ยวกับภาษา Python กันต่อ
ภายในตัวอย่างด้านล่าง พี่มงจะใช้ตัวอย่างเป็นคำว่า "@55_kumamon" ครับ

ขั้นแรกก็จะต้องแตกออกมาเป็นกล่องที่ใส่ตัวอักษรได้ 1 ตัวอักษรซะก่อน
น้องก็จะได้ประมาณนี้ครับ

| ตัวอักษร       | @ | 5 | 5 | _ | k | u | m | a | m | o  | n  |
|--------------|---|---|---|---|---|---|---|---|---|----|----|
| ลำดับที่        | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

น้องก็จะเห็นว่าตัวอักษร '@' นั้นเป็นตัวแรก และ 'n' เป็นตัวสุดท้าย

ปกติแล้ว คนที่ยังไม่เคยเขียนโปรแกรม เค้าก็จะเรียกตัวแรกว่าตัวที่ 1 เนอะ ตามหลักการทางคณิตศาสตร์เลย
แต่นี่มันคอมพิวเตอร์นิ ก็ต้องทำให้โลกจำ โดยการสอนคนเขียนโปรแกรมว่า เรื่มนับ Array ที่เลข 0 ครับ


ขอบคุณ meme จาก reddit.com

How Python keeps data

เพราะอะไรหน่ะเหรอ??? StackOverflow.comopen in new window สิครับ รออะไร
(ขอโน้ตไว้ก่อนว่า Python นั้นเขียนมาจากภาษา C นะครับ)

ถ้าอ่านไม่เข้าใจ พี่ก็จะอธิบายให้เองครับ
โดยปกติแล้ว เวลาหน่วยความจำเอาอะไรไปเก็บ ก็จะต้องมีเลขกำกับ เพื่อให้ตัว CPU เรียกใช้ข้อมูลได้ถูกอัน และรู้ว่าอันไหนคืออะไร และมีการเก็บข้อมูลได้เรียงตัวถูกต้อง (ให้คิดว่าเก็บไว้ใน locker และใน locker มีข้อมูลอยู่) เวลาที่น้องเอาข้อมูลไปเก็บในตัวแปร ข้อมูลนั้นก็จะถูกเก็บไว้ใน locker ครับ แต่ตู้นึงเก็บข้อมูลได้นิดเดียว เลยต้องแบ่งเก็บเป็นล็อคครับ ตัวอย่างเช่น เก็บตั้งแต่ตู้ที่ 11 จนถึงตู้ที่ 20

พอจะเรียกเพื่อดูข้อมูล ระบบก็จำได้ว่าเก็บตู้แรกที่ตู้เบอร์ 11 ครับ และมีข้อมูลที่อยู่ถัดไปอีก 9 ตู้ รวมเป็น 10 ตู้นั่นเอง

และระบบก็รู้ว่าตัวเองจะเก็บข้อมูลแบบเรียงต่อกัน (เพื่อประโยชน์ในการเรียกข้อมูลได้เร็ว) ทำให้ระบบเลือกเอาข้อมูลในตู้ที่ 11, 12, 13, 14, 15, 16, ..., 20 นั่นเอง

การเก็บแบบนี้ ทำให้ระบบไม่จำเป็นที่จะต้องจำว่า เก็บตู้ 11, 12, 13, 14, 15... หรือเรื่มตู้ที่ 11 และจบที่ 20 ครับ เพราะกินค่าจำเยอะเหมือนกันนะ เพราะในความจริงต้องจำเป็นหลักพันหลักหมื่นเลย การคำนวณแบบนี้ (ตู้แรก และจำนวนตู้ที่มีหลังจากนั้น) จึงทำให้เรียกดูง่าย และใช้ทรัพยากรในการเก็บข้อมูลน้อยลงครับ

จึงทำให้ เวลาเขียนโปรแกรม เค้าก็เลยใช้หลักการณ์เหมือนกันครับ
เช่น น้องอยากได้ตู้ที่ 11 นั่นก็คือตู้ที่ 11 + 0 หรือตู้ที่ 20 ก็คือตู้ที่ 11 + 9 ครับ

ด้วยเหตุผลอันไม่น่าเข้าใจได้ดังเกล่า ทำให้ array จึงเรื่มต้นที่ 0 ครับ

หากเข้าใจแล้ว String "@55_kumamon" ก็จะมีการเรียงดังนี้ครับ

| ตัวอักษร       | @ | 5 | 5 | _ | k | u | m | a | m | o  | n  |
|--------------|---|---|---|---|---|---|---|---|---|----|----|
| ลำดับใน array | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9  | 10 |

แต่ถ้าน้องๆไม่อยากนับ ว่ามันมีกี่ตัวกันแน่ ก็สามารถใช้ len() ซึ่งก็ย่อมาจากคำว่า length หรือความยาวนั่นเอง โดยก็จะนับจำนวนตัวอักษรใน array string ให้นั่นเอง

ตัวอย่างเช่น

first_name = "@55_kumamon"
first_name_len = len(first_name)
print(first_name_len)

คำเตือน

String ไม่จัดว่าเป็นการเก็บข้อมูลแบบ Array แต่ในการใช้งานหลายๆอย่างที่ใช้งานร่วมกันได้

first_name_string = "kuma"
first_name_array = ['k', 'u', 'm', 'a']

first_name_string == first_name_array
>>> False

เลือกตัวอักษรตัวเรื่มต้น (Start)

หากน้องต้องการเอาตัวอักษร '@' มาจาก string ก็สามารถเขียนได้ดังนี้ครับ

text = "@55_kumamon"
print(text[0])

จุดที่ต้องสังเกตอยู่ที่ text[0] ครับ เป็นการบอกว่าจะเอาตัวที่ 0 ([@]) มาจากตัวแปร text นั่นเอง

วิธีการเรียก นั่นก็คือ มีตัวแปร และก็ตามด้วยกล่อง [] ครับ โดยน้องใส่หมายเลขกล่อง (ตัวอักษร) เข้าไปครับ และผลลัพท์ก็จะออกมา

แล้วถ้าต้องการเรียกหลายอัน เหมือนเป็นกลุ่มหล่ะ

การเลือกตัวอักษรตัวสิ้นสุด (Stop)

น้องสามารถเขียนเหมือนอันด้านบนหล่ะครับ แต่น้องเพื่มขั้นตอนขึ้นมาอีกนิดนึง
โดยการเขียนเครื่องหมาย : ไปขั้นครับ

วิธีการใช้งานก็คือ [<ตัวอักษรตัวแรก> : <ตัวอักษรหลังตัวสุดท้ายที่เลือก>]

อาจจะยังไม่เก็ท ก็ดูตัวอย่างเอาละกันครับ

ตัวอย่างการใช้งาน

text = "@55_kumamon"
print(text[0:8])

ก็จะแสดงคำว่า "@55_kuma" บนหน้าจอนะครับ
จุดสังเกตนั่นก็คือ พี่ได้เลือกตั้งแต่ตัวที่ 0 นั่นก็คือ @ จนถึงตัวที่ 8 นั่นก็คือ m แต่ทำไมมันออกมาเป็น "@55_kumam" หล่ะ

เอาเป็นว่ามันเป็นหลักของเค้าอ่ะครับ ระวังด้วยละกัน 😙

แต่หากว่าจะเลือกตั้งแต่ตัวแรกจนถึงตัวที่ 8 อยู่แล้หล่ะ น้องๆก็สามารถละเว้นไว้ได้
ตัวอย่างเช่น

text = "@55_kumamon"
print(text[:8])

เพราะ Python ถือว่าน้องไม่ยอมบอกเอง ก็จะถึือว่าอยู่ ณ ที่ความเข้าใจเดียวกัน (default) ไปว่าต้องเรื่มจากตัวแรก

การเลือกข้ามเลือกตัวอักษร (Step)

หากน้องต้องการที่จะเลือกเพียงบางตัว เช่นเลือกตัวแรก แล้วก็ข้าม 2 ตัว แล้วก็ค่อยเลือก
น้องก็สามารถทำได้โดยการเพื่ม : เข้ามาอีกตัวนึง ก็จะได้เป็น

text = "@55_kumamon"
text[::2]

และเนื่องจากน้องก็รู้ว่า หากไม่มีตัวเลขเรื่ม (Start) และตัวสุดท้าย (Stop) ก็จะถือในความเข้าใจเหมือนกันว่า เลือกทุกตัวนั่นเอง

สรุปการใช้งาน Start : Stop : Step

<variable_name>[start:stop:step]

# Start -> ให้เรื่มตั้งแต่ตัวอักษรไหน       ( Default : ตัวแรกของบรรทัด )
# Stop  -> ให้หยุดที่ตัวอักษรไหน          ( Default : ตัวสุดท้ายของบรรทัด )
โดยจะลบค่านั้นไปอีก 1 หากมีการเขียน start ด้วย
# Step  -> ข้ามตัวอักษรเมื่อครบทุกๆ n ตัว  ( Default : 1 )    

หากน้องไม่ได้ใส่ข้อมูล ตัว Python ก็จะทำการใช้ค่า default ให้ครับ แม้น้องๆจะเขียนระบุใว้ใน [] หรือไม่ก็ตาม

ตัวอย่างการใช้งานย่อๆ

text = '12345'
text[0]  ได้ผลลัพท์เท่ากับการเขียน text[0:1] หรือ text[0:1:1]
text[:4] ได้ผลลัพท์เท่ากับการเขียน text[0:4]
text[1:] ได้ผลลัพท์เท่ากับการเขียน text[1:5]

เล่นผานโผนกับ Start Stop Step

โจทย์คำถาม หาก Stop เป็นตัวเลขติดลบหล่ะ

var = "ABCD"
print(var[-1]) 

ก็จะปรี้นท์ "D" ออกมา เนื่องจากว่าถ้าใส่ตัวเลขเป็นเลขติดลบ จะทำให้ Python เลือกจากข้างหลังนั่นเอง (เหมือนตัวอักษรเป็น "DCBA" แล้วเลือกตัวที่ 1-1 = 0 นั่นเอง)

โจทย์คำถาม ถ้า Array จริงน้อยกว่าที่เราต้องการเรียก

var = "ABCD"
print(var[50]) 

ก็จะเกิด error (IndexError) เนื่องจากว่า array ตัวที่ 50 ไม่มีอยู่จริง

โจทย์คำถาม ถ้าเราเลือกเอาตั้งแต่ตัวที่ 4 ไปจนถึงตัวที่ 50 (ที่ไม่มีอยู่จริง) หล่ะ

var = "My name is Kumamon, and I love eating"
print(var[3:50]) 

ก็ยังออกมาเหมือนกับการใช้ var[3:] เลยครับ เพราะจะอยู่ในฐานความเข้าใจเดียวกันว่า ถ้าเลือกเกินก็ไม่เป็นไร ก็จะเลือกถึงตัวสุดท้ายอยู่ดี แต่อย่าทำเลยครับ ไม่ค่อยจะดีซะเท่าไหร่ อิอิ

โจทย์คำถาม อยากเลือกเอาตัวอักษรตั้งแต่ตัวที่ 1 จนถึงตัวที่ 2 (เลือกเพียงบางช่วง)

var = "ABCD"
print(var[0:2])

ก็จะแสดงออกมาเป็น "AB" (โดยเรื่มเอาจากตัวที่ 0 จนถึงตัวที่ 2-1 = 1)
อย่าลืมว่าต้องไป -1 ด้วยนะครับ

โจทย์คำถาม อยากเรื่มตั้งแต่ตัวที่ 3 ไปจนสุดตัวสุดท้ายเลย

var = "My name is Kumamon, and I love eating"
print(var[3:])

ก็จะแสดงออกมาเป็น "name is Kumamon, and I love eating" เพราะเรื่มตั้งแต่ตัวที่ 3 และ Stop ถูกละไว้ ทำให้อยู่ในฐานความเข้าใจเดียวกันว่าเลือกจนถึงตัวสุดท้าย

โจทย์คำถาม อยากเรื่มตั้งแต่ตัวแรก จนถึงตัวที่ 6

var = "My name is Kumamon, and I love eating"
print(var[:7])
# Prints out "My name" (Starting from 0th array number to the 7th)

โจทย์คำถาม อยากเลือกทีละ x ตัว แต่เลือกจากหลังมาหน้า

var = "ABABABAB"
print(var[::-2])
# Prints out BBBB (Skips after logical number hits every -2, which is A)

String with array counts and find

Finding character in text -> .find()
Count character in text that satisfies search query -> .count()
Finding text in array -> .index()

Count all character in text -> len()

Using .find()

How to use:
<variable name>.find("<character/text you want to find>")
-> Return as the lowest array number

# 1 occurence character
var = "ABCDE"
return var.find("A") # Returns 0

# 2 occurence character
var = "ABCDEAAAAA"
return var.find("A") # Returns 0

# Non occurence character
var = "ABCDE"
return var.find("F") # Returns -1

# Using more than 1 character
var = "Kumamon is happy"
return var.find("Kuma") # Returns 0

# Using more than 1 character + 2 occurrence
var = "Kumamon is happy, Kumamon is happy"
return var.find("Kuma") # Returns 0

Using .count()

How to use:
<variable name>.count("<character/text you want to count>")
-> Returns the amount of character count.

# 1 occurence character
var = "ABCDE"
return var.count("A") # Returns 1

# 2 occurence character
var = "ABCDEAAAAA"
return var.count("A") # Returns 6

# Non occurence character
var = "ABCDE"
return var.count("F") # Returns 0

# Using more than 1 character
var = "Kumamon is happy"
return var.count("Kuma") # Returns 1

# Using more than 1 character + 2 occurrence
var = "Kumamon is happy, Kumamon is happy"
return var.count("Kuma") # Returns 2

Using len()

How to use:
len(<variable you want to count character>)
Returns number of elements/character in array/text

# Using to count strings
return len("Kumamon") # Returns 7

# Using to count strings in variable
var = "Kumamon"
return len(var) # Returns 7

# Using to count elements in array
var = [11,12,13,14,15]
return len(var) # Retuns 5