Python เป็นผู้คับคั่งกฎอย่างเข้มงวด หนึ่งในคุณสมบัติหลักของภาษา Python รักษาให้คุณอยู่ในเงื่อนไข เพื่อให้โปรแกรมของคุณทำงานในลักษณะที่คุณตั้งใจ คุณอาจพบข้อผิดพลาดที่กล่าวว่า "not all arguments converted during string formatting" เมื่อคุณทำงานกับสตริง
ในคู่มือนี้ เราพูดถึงข้อผิดพลาดนี้และทำไมมันจึงโผล่ขึ้น เราจะเดินทางผ่านสองสถานการณ์ทั่วไปที่ข้อผิดพลาดนี้ถูกยกขึ้น เพื่อช่วยให้คุณแก้ไขในโค้ดของคุณ
โดยไม่ล่าช้า มาเริ่มกันเลย!
ปัญหา: typeerror: not all arguments converted during string formatting
TypeError เป็นประเภทของข้อผิดพลาดที่บอกเราว่าเรากำลังทำงานที่ไม่สามารถ execute บนค่าที่มีชนิดข้อมูลเฉพาะได้ ในกรณีนี้ ข้อผิดพลาดประเภทของเรานั้นเกี่ยวข้องกับค่าสตริง
Python เสนอหลายวิธีที่คุณสามารถจัดรูปแบบสตริงได้ นี่ช่วยให้คุณแทรกค่าเข้าไปในสตริง หรือต่อค่าต่อท้ายสตริง
สองวิธีที่พบบ่อยที่สุดในการจัดรูปแบบสตริงคือ:
- ใช้ตัวดำเนินการ % (old-style)
- ใช้ตัวดำเนินการ {} กับฟังก์ชัน .format()
เมื่อคุณพยายามใช้ไวยากรณ์ทั้งสองนี้ร่วมกัน ข้อผิดพลาดจะถูกยกขึ้น
ตัวอย่าง: การผสมกฎการจัดรูปแบบสตริง (Mixing String Formatting Rules)
มาเขียนโปรแกรมที่คำนวณการเพิ่มราคา 5% สำหรับผลิตภัณฑ์ที่ขายที่ร้านเบเกอรี่
เราเริ่มต้นด้วยการรวบรวมสองชิ้นข้อมูลจากผู้ใช้: ชื่อผลิตภัณฑ์และราคาของผลิตภัณฑ์ เราทำได้โดยใช้คำสั่ง input():
name = input("Enter the name of the product: ") price = input("Enter the price of the product: ") ต่อไป เราคำนวณราคาใหม่ของผลิตภัณฑ์โดยการคูณค่าของ "price" ด้วย 1.05 นี่แสดงถึงการเพิ่มราคา 5%:
increase = round(float(price) * 1.05, 2)
เราปัดค่าของ "increase" ให้เหลือสองตำแหน่งทศนิยมโดยใช้คำสั่ง round() สุดท้าย ใช้การจัดรูปแบบสตริงเพื่อพิมพ์ราคาใหม่ของผลิตภัณฑ์ไปยังคอนโซล:
print("The new price of {} is ${}. " % name, str(increase)) โค้ดนี้เพิ่มค่าของ "name" และ "increase" เข้าไปในสตริงของเรา เราแปลง "increase" เป็นสตริงเพื่อรวมเข้ากับสตริงของเรา ก่อนที่เราจะแปลงค่า "increase" เป็นเลขจุดลอยตัว (floating-point number) เรียกใช้โค้ดของเราและ看看发生什么:
Traceback (most recent call last): File "main.py", line 6, in <module> print("The new price of {} is {}" % name, str(discount)) TypeError: not all arguments converted during string formatting ดูเหมือนว่ามีข้อผิดพลาดในบรรทัดสุดท้ายของโค้ดของเรา
ปัญหาคือเราผสมสับสนไวยากรณ์การจัดรูปแบบสตริงของเรา เราใช้ตัวดำเนินการ {} และ % ซึ่งใช้สำหรับการจัดรูปแบบสตริงสองประเภทที่แตกต่างกัน
เพื่อแก้ปัญหานี้ เราแทนที่บรรทัดสุดท้ายของการเขียนโปรแกรมของเราด้วยบรรทัดโค้ดใดบรรทัดหนึ่งต่อไปนี้:
print("The new price of {} is ${}.".format(name, str(increase))) print("The new price of %s is $%s." % (name, str(increase))) บรรทัดโค้ดแรกใช้ไวยากรณ์ .format() นี่แทนที่ค่าของ {} ด้วยค่าในคำสั่ง .format() ตามลำดับที่ระบุ
บรรทัดโค้ดที่สองใช้เทคนิคการจัดรูปแบบสตริงแบบเก่า % ค่า "%s" จะถูกแทนที่ด้วยค่าที่ปิดอยู่ในวงเล็บหลังตัวดำเนินการ %
มารันโค้ดของเราอีกครั้งและ看看发生什么:
Enter the name of the product: Babka Enter the price of the product: 2.50 The new price of Babka is $2.62.
โค้ดของเราเพิ่มอาร์กิวเมนต์ของเราเข้าไปในสตริงสำเร็จแล้ว
ตัวอย่าง: การสับสนตัวดำเนินการ Modulo (Modulo Operator)
Python ใช้เครื่องหมายเปอร์เซ็นต์ (%) เพื่อคำนวณตัวเลข modulo และการจัดรูปแบบสตริง ตัวเลข Modulo คือเศษที่เหลือหลังจากการหาร
หากคุณใช้เครื่องหมายเปอร์เซ็นต์บนสตริง มันจะถูกใช้สำหรับการจัดรูปแบบ หากคุณใช้เครื่องหมายเปอร์เซ็นต์บนตัวเลข มันจะถูกใช้คำนวณ modulo ดังนั้น หากค่าถูกจัดรูปแบบเป็นสตริงที่คุณต้องการคำนวณ modulo ข้อผิดพลาดจะถูกยกขึ้น
看看โปรแกรมที่คำนวณว่าตัวเลขเป็นคี่หรือคู่:
number = input("Please enter a number: ") mod_calc = number % 2 if mod_calc == 0: print("This number is even.") else: print("This number is odd.") ก่อนอื่น เราขอให้ผู้ใช้ป้อนตัวเลข เราใช้ตัวดำเนินการ modulo เพื่อคำนวณเศษที่คืนค่าเมื่อ "number" ถูกหารด้วย 2
หากค่าที่คืนโดยตัวดำเนินการ modulo เท่ากับ 0 เนื้อหาของคำสั่ง if ของเราจะ execute มิฉะนั้น เนื้อหาของคำสั่ง else จะรัน
มารันโค้ดของเรา:
Please enter a number: 7 Traceback (most recent call last): File "main.py", line 2, in <module> mod_calc = number % 2 TypeError: not all arguments converted during string formatting
TypeError อีกครั้ง ข้อผิดพลาดนี้ถูกยกขึ้นเพราะ "number" เป็นสตริง เมธอด input() คืนค่าสตริง เราต้องแปลง "number" เป็นจุดลอยตัวหรือจำนวนเต็ม หากเราต้องการคำนวณ modulo
เราสามารถแปลง "number" เป็น float โดยใช้ฟังก์ชัน float():
mod_calc = float(number) % 2
มาลองรันโค้ดของเราอีกครั้ง:
Please enter a number: 7 This number is odd.
โค้ดของเราทำงาน!
สรุป
ข้อผิดพลาด "not all arguments converted during string formatting" ถูกยกขึ้นเมื่อ Python ไม่ได้เพิ่มอาร์กิวเมนต์ทั้งหมดในการดำเนินการจัดรูปแบบสตริง สิ่งนี้เกิดขึ้นหากคุณผสมสับสนไวยากรณ์การจัดรูปแบบสตริงของคุณ หรือหากคุณพยายามคำนวณ modulo บนสตริง
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาด Python ทั่วไปนี้อย่างวิศวกรซอฟต์แวร์มืออาชีพแล้ว!