มีหลายวิธีในการจัดการสตริงใน Python หากคุณต้องทำให้ตัวอักษรแรกของสตริงเป็นตัวพิมพ์ใหญ่ในโจทย์เขียนโค้ด (code challenge) คุณจะทำอย่างไร? บทความนี้พูดถึงหนึ่งในวิธีที่คุณสามารถจัดการสตริงเพื่อให้บรรลุวัตถุประสงค์นั้น
โจทย์ (The Prompt)
ได้รับสตริง Python ให้เขียนฟังก์ชันที่จะทำให้ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่และคืนค่ากลับ
ถามคำถามเพื่อความชัดเจน (Ask Clarifying Questions)
โจทย์นี้อาจถูกให้ในระหว่างสัมภาษณ์งาน ในกรณีนั้น ให้ถามผู้สัมภาษณ์เพื่อให้ชัดเจนว่าเข้าใจปัญหาอย่างถูกต้อง
นี่คือคำถามบางส่วนที่คุณอาจคิดถึงเมื่อเราเข้าใกล้ปัญหา:
- คำถาม: สตริงจะมีอยู่เสมอหรือไม่? ฉันจะไม่ต้องจัดการกับสตริงที่เป็น null หรือว่างเปล่าหรือไม่?
- คำตอบ: สตริงไม่ได้มีอยู่เสมอ ดีที่ควรคำนึงถึงกรณีขอบ (edge cases) นี้!
- คำถาม: ตัวอักษรแรก หมายถึงแค่ตัวอักษรแรกของสตริงเอง หรือตัวอักษรแรกของแต่ละคำในสตริง? คุณต้องการให้กำหนดอย่างไร?
- คำตอบ: ตัวอักษรแรกของสตริงเอง
- คำถาม: ตัวอักษรแรกจะเป็นตัวอักษรเสมอหรือไม่? ฉันต้องจัดการกับกรณีที่ตัวอักษรแรกในสตริงอาจเป็นตัวเลขหรือไม่?
- คำตอบ: จับจุดได้ดี ตัวอักษรแรกอาจไม่ใช่ตัวอักษรแรกในสตริงเสมอไป ฉันต้องการให้คุณทำให้ตัวอักษรแรกของสตริงเป็นตัวพิมพ์ใหญ่
แนวทาง (The Approach)
มีวิธีแนวทางที่แตกต่างกันสองสามวิธีในการแก้ปัญหานี้ มีวิธีที่ถูกต้องมากกว่าหนึ่งวิธี หากคุณคิด出วิธีที่แตกต่างกัน ยอดเยี่ยม!
จัดการ Edge Cases ก่อน หากถูกถามให้จัดการ
ที่นี่ เราต้องจัดการกับสิ่งที่เกิดขึ้นเมื่อเรามีกรณีที่ไม่มีสตริง สตริงว่าง หรือตัวอักษรแรกไม่ใช่ตัวอักษร มาเขียนโค้ดส่วนนี้กัน:
def capitalize_str(str):
if str == None: # if str is None
return "NoneType is not a string"
elif len(str) > 0: #if str exists
# what type of char is first character? If number, move to next letter, if letter, capitalize it.
return str #this is temporary -- we'll change this in next step.
else: #if str is empty
return "undefined string"
capitalize_str("hello")
ที่นี่ เราจัดการกับ edge cases ที่สตริงจะเป็น None หรือมีความยาว 0 เรายังไม่ได้ทำอะไรกับตรรกะการคืนค่าสตริงพร้อมตัวอักษรที่เป็นตัวพิมพ์ใหญ่ เราต้องแน่ใจว่ามันมีอยู่ก่อน
มาดูวิธีตรวจสอบว่าตัวอักษรแรกในสตริงเป็นตัวอักษรหรือไม่ หากเป็นตัวเลขหรืออักขระพิเศษ เราต้องไปยังตัวอักษรถัดไปจนกว่าจะพบตัวอักษรแรก หากเป็นตัวอักษร เราทำให้เป็นตัวพิมพ์ใหญ่และคืนค่าสตริงพร้อมตัวอักษรที่เป็นตัวพิมพ์ใหญ่ หากเราไปถึงท้ายสตริงและไม่มีตัวอักษร ให้บอกว่ามี
def capitalize_str(str):
if str == None: # if str is None
return "NoneType is not a string"
elif len(str) > 0: #if str exists
# what type of char is first character? If number, move to next letter, if letter, capitalize it.
i = 0
while i < len(str):
if str[i].isalpha():
return str[0:i] + str[i].upper() + str[i + 1:]
else:
i += 1
return "string does not have letters"
else: #if str is empty
return "undefined string"
print(capitalize_str("christina"))
หนึ่งในเมธอดสตริงที่มีอยู่ใน Python คือ isalpha() มันตรวจสอบให้แน่ใจว่าอักขระเป็นส่วนหนึ่งของอักษรภาษาอังกฤษ หากไม่ใช่ มันจะไปยังตัวอักษรถัดไป เมื่อเราไปถึงตัวอักษรตัวแรก เราจะคืนค่าการต่อสตริงของด้านซ้ายของสตริง ตัวอักษรตัวพิมพ์ใหญ่ และส่วนที่เหลือของสตริง
มีฟังก์ชัน capitalize() ของ Python ที่ทำงานได้เพราะมันแปลงตัวอักษรแรกเป็นตัวพิมพ์ใหญ่ แต่ไม่สามารถจัดการ edge case ที่ตัวอักษรแรกไม่ใช่ตัวอักษรได้ นี่คือเหตุผลที่เราวนลูปด้วย while loop และหยุด while loop โดยเจตนาบนครั้งแรกที่พบตัวอักษร
สรุป
นี่เป็นเพียงหนึ่งในวิธีในการเอาชนะโจทย์เขียนโค้ดนี้! แน่นอนว่ามีอีกมากมายที่ดีไม่แพ้ (ถ้าไม่ใช่ดีกว่า) วิธีที่กล่าวถึงที่นี่ เป้าหมายคือการเรียนรู้ที่จะถามคำถามหากคุณไม่ชัดเจนกับโจทย์ และคิดถึง edge cases! หากคุณทำได้ คุณจะผ่านโจทย์เขียนโค้ดได้โดยไม่มีปัญหาโชคดี!