String Format

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

var1 = 21
print("Kumamon is already", var1, "years old")

เพื่อจะได้ผลลัพท์ "Kumamon is already 21 years old"

วันนี้ พี่มงจึงมาสอนการใข้ % และ .format() และ f string ครับ

F string method

NOTE

การใช้ F String นี้ได้เพื่มมาใน Python เวอร์ชั่น 3.6 ครับ (Reference PIP 498open in new window) ดังนั้นน้องๆจำเป็นที่จะต้องใช้ Python เวอร์ชั่นอย่างน้อย 3.6 ขึ้นไป เพื่อจะใช้ method นี้ได้ครับ

ในวิธีนี้ เป็นฟีเจอร์ของ Python3 ที่ต้องการที่จะผู้ใช้งานไม่ต้องไปดูว่าในลำดับไหน ใช้ค่าผลลัพท์ตัวแปรอันไหน

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

text = "Kumamon"
number_one = 2
number_two = 1
number_three = 2.99

print(f"The answer is {number_one} + {number_two} = {number_three}. Calculated by {text}")

โอ้โห อ่านง่ายขึ้นเยอะเลย แต่ปัญหาคือ จะได้ผลลัพท์ที่ถูกต้องหรือเปล่าเอ่ย?

Python 3.7.0 (default, Oct  2 2018, 09:18:58)
[Clang 10.0.0 (clang-1000.11.45.2)] on darwin

>>> text = "Kumamon"
>>> number_one = 2
>>> number_two = 1
>>> number_three = 2.99
>>> print(f"The answer is {number_one} + {number_two} = {number_three}. Calculated by {text}")

The answer is 2 + 1 = 2.99. Calculated by Kumamon

โอ้ววววว ใช้ง่ายแบบนี้ต้องสอนวิธีการใช้ซะแล้ว

How to use F String

การใช้ก็ง่ายมากเลย โดยให้ใส่ตัวอักษร f (เอฟ) โดยจะเป็นตัวพิมพ์เล็ก หรือ พิมพ์ใหญ่ก็ได้ครับก่อนหน้า string "" หรือ ''

และการเอาตัวแปรไปยัด ก็ให้ใช้ปีกกา {} เพื่อบอกว่าจุดนั้นคือจุดที่ตัวแปรจะไปอยู่นั่นเอง

หากใช่ง่ายแบบนี้ ก็ลองไปใช้ดูนะครับ

.format() method

การใช้ method นี้ก็เพื่อทำการนำค่าในตัวแปรไปอยู่ใน string โดยที่ไม่ต้องไปทำอะไรเยอะแยะ แต่เราก็ยังต้องทำการบอกว่า ตัวแปรไหน มีค่าเท่าไหร่ และอยู่ในลำดับไหน

How to use .format()

TIP

ตอนนี้พี่มงขอไม่เขียนก็แล้วกันนะครับ เพราะว่าอยากให้น้องไปใช้ F String กัน อิอิ

% formatting

เอาจริงๆ มันก็คือเครื่องหมายเปอร์เซ็นต์นั่นแหละครับ แต่ก็ทำให้มันเป็น ที่วางตัวแปร ได้เช่นเดียวกัน

อันนี้เป็นวิธีการใช้งานครับ น้องๆอาจจะยังไม่เข้าใจก็ไม่เป็นไร ค่อยกลับมาดูก็ได้ครับ

ใช้%s%d%f%e
เพื่อแสดงตัวแปรประเภทStringIntegerFloatเลขฐานในหลักวิทยาศาสตร์
(Scientific Significant)

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

age = 21
print("Kumamon is already %d years old" %age)

ก็จะได้ผลลัพท์ "Kumamon is already 21 years old" เช่นเดียวกันครับ

โดยหลักการคร่าวๆนั่นก็คือ Python จะทำการเอาตัวแปร age เข้าไปยัดในจุดที่ %d อ ยู่ ทำให้ได้ผลลัพท์ได้ออกมาแบบนั้นครับ

แล้วถ้าพี่อยากใส่มากกว่า 1 ตัวหล่ะ เช่น "My name is <first_name> and my age is <age> years old" โดยตัวแปร <first_name> และ <age> พี่จะกำหนดค่าตัวแปรเอง

หากว่าพี่ใช้วิธีโบราณ ด้วยการเอาไปแปะ (Concat) ก็ได้เขียนได้ดังนี้ครับ

first_name = "Kumamon"
age = 21

print("My name is", first_name, "and my age is", age, "years old")

ซึ่งก็เขียนยากซะเหลือเกิน อิอิ

แต่เมื่อน้องเรียนการใช้ % แล่้ว น้องๆก็สามารถใช้ % ได้ดังนี้ครับ

first_name = "Kumamon"
age = 21

print("My name is %s and my age is %d years old" %(first_name, age))

ก็จะได้ผลลัพท์เป็น "My name is Kumamon and my age is 21 years old" นั่นเอง

เห็นมั้ยครับ ว่ามันง่ายขึ้นเยอะ
ส่วนน้องๆที่บอกว่า "พี่มงขี้โม้ มันยากกว่าเดิมหนิพี่" ก็คิดว่ามันง่ายกว่าเดิมละกันครับ และพี่ก็ไม่ได้โม้ เพราะเรายังไม่จบแค่นี้ครับ

ตั้งการมี Space

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

แต่เนื่องจากว่า Python ก็ได้จัดการทำ Aligment มาให้ด้วย
เช่นต้องการให้เป็นแบบนี้

My Name is Kumamon              naja
My Name is              Kumamon naja          

นั่นก็คือการให้มันชิดขวา และ ชิดซ้ายนั่นเอง

น้องๆก็สามารถทำให้มันชิดได้ โดยการใส่ตัวเลขไปด้วย
ตัวอย่างเช่น

first_name = "Kumamon"
print("My Name is %-20s naja" %first_name)   
print("My Name is %20s naja" %first_name) 

ก็จะได้ผลลัพท์เหมือนด้านบนครับ

โดยหลักการนั่นก็คือ Python จะเว้นที่ไว้ x ช่อง (ซึ่งในตัวอย่างเว้นไว้ 20 ช่่อง)
แล้วค่อยใส่ String ไปตรงนั้น

โดยหากว่า

  • เป็นเลขจำนวนเป็นบวก ก็จะชิดขวา
  • เป็นเลขจำนวนเป็นลบ ก็จะชิดซ้าย

ตัดความยาว String

หลังจากได้เรียนการ align กันมาแล้ว ก็จะบอกว่ายังมี function นึงที่น้องๆอาจจะยังไม่เคยเจอ นั่นก็คือการตัดให้ได้ขนาด x ตัว

ไปดูตัวอย่างกันครับ

โดยปกติแล้ว เราก็จะใช้ [] แบบนี้

first_name = "Kumamon"
print("My name is", first_name[:4])

ก็จะได้ผลออกมาเป็น "My name is Kuma" นั่นเอง

ซึ่งตัว % ก็ทำได้เช่นกันครับ ดังตัวอย่างข้างล่าง

first_name = "Kumamon"
print("My name is %s", %first_name[:4])

แต่ก็ยังไม่สุดๆไปเลย เหมือนเพลงของนูโวopen in new window เพราะยังทำแบบนี้ได้อีกครับ

first_name = "Kumamon"
print("My name is %.4s", %first_name)

แต่ต้องเตือนไว้ก่อน ว่าถ้าใส่ตัวเลขไปมากกว่าที่ array string มีอยู่ ก็จะเป็นแบบนี้ครับ


String with ASCII

https://i.stack.imgur.com/X4yts.pngReference : https://i.stack.imgur.com/X4yts.png

ต้องอธิบายก่อนว่า ปกติแล้วโปรแกรมคอมพิวเตอร์ทุกอัน ได้ทำการเปลี่ยนการจัดเก็บข้อมูลแบบ string หรือ character ให้มาเป็นตัวเลขทั้งหมด เพื่อจะเอาไปเก็บเป็น binary ทีหลัง

ดังนั้น ASCII จึงเกิดขึ้น โดยการบอกให้ว่า เลขนี้ เท่ากับตัวอักษรอะไร และตัว Python จึงไปทำการคำนวณต่อ ว่าให้ทำอะไรต่อไป

ดังนั้นวันนี้เราจะมาลองเล่นดูครับ

การเปลี่ยน String ไปเป็น ASCII โดยใช้ ord()

การเปลี่ยน character ไปเป็น ASCII ก็สามารถทำได้ง่ายๆ โดยการใช้ function ord() ครับ และใส่ character ไปเป็น input parameter ของฟังก์ชั่น

print(ord('A'))         # Print out 65
print(ord('B'))         # Print out 66
print(ord('A') + 1)     # Print out 66

การเปลี่ยน ASCII ไปเป็น String โดยใช้ chr()

เปลี่ยนตัวเลข (ย้ำว่าควรเป็นประเภท integer อยู่) ก็สามารถทำได้โดยการใช้ฟังก์ชั่น chr() และใส่ตัวเลขเข้าไปเป็น input parameter ของฟังก์ชั่น

print(chr(65))      # Print out 'A'
print(chr(65+1))    # Print out 'B'
print(chr(65+2))    # Print out 'C'

var = 65
print(chr(var)) # Print out 'A'

String to change case

เปลี่ยนตัวอักษรไปเป็น lowercase .lower()
เปลี่ยนตัวอักษรไปเป็น uppercase .upper()
สลับตัวอักษรระหว่าง lower/upper .swapcase()

เช็คว่าตัวอักษรนั้นเป็น lowercase ทั้งหมดหรือไม่ .islower()
เช็คว่าตัวอักษรนั้นเป็น uppercase ทั้งหมดหรือไม่ .isupper()
เช็คว่าตัวอักษรนั้นเป็นตัวเลขทั้งหมดหรือไม่ .isdigit()
เช็คว่าตัวอักษรนั้นเป็นตัวอักษรทั้งหมดหรือไม่ .isalpha()

Using .lower()

return text.lower()
# If text = "KUMAMON", returns "kumamon"
# If text = "KuMaMoN", returns "kumamon"
# If text = "kumamon", returns "kumamon"

Using .upper()

return text.upper()
# If text = "KUMAMON", returns "KUMAMON"
# If text = "KuMaMoN", returns "KUMAMON"
# If text = "kumamon", returns "KUMAMON"

Using .swapcase()

return text.swapcase()
# If text = "KUMAMON", returns "kumamon"
# If text = "KuMaMoN", returns "kUmAmOn"
# If text = "kumamon", returns "KUMAMON"

Using .isupper() & .islower()

<string>.islower()
<string>.isupper()

text = "K"
return text.islower() # Returns false
return text.isupper() # Returns true

text = "k"
return text.islower() # Returns true
return text.isupper() # Returns false

Using .isdigit() & .isalpha()

How to use:
<input variable>.isdigit()
-> Returns True or False

<input variable>.isalpha()
-> Returns True or False

text = "12"
return text.isdigit() # Returns true
return text.isalpha() # Returns false

text = "ABC"
return text.isdigit() # Returns false
return text.isalpha() # Returns true