Python เป็นตัวกำหนดกฎเกณฑ์ หนึ่งในคุณสมบัติหลักของภาษา Python ช่วยให้คุณถูกตรวจสอบเพื่อให้โปรแกรมของคุณทำงานในแบบที่คุณต้องการ คุณอาจพบข้อผิดพลาดว่า "ไม่ได้แปลงอาร์กิวเมนต์ทั้งหมดในระหว่างการจัดรูปแบบสตริง" เมื่อคุณทำงานกับสตริง
ในคู่มือนี้ เราจะพูดถึงข้อผิดพลาดนี้และสาเหตุที่แสดงขึ้น เราอธิบายสถานการณ์ทั่วไปสองสถานการณ์ซึ่งเกิดข้อผิดพลาดนี้ขึ้นเพื่อช่วยคุณแก้ไขในโค้ดของคุณ
เริ่มกันเลย!
ปัญหา:typeerror:ไม่ได้แปลงอาร์กิวเมนต์ทั้งหมดระหว่างการจัดรูปแบบสตริง
TypeError เป็นข้อผิดพลาดประเภทหนึ่งที่บอกเราว่าเรากำลังดำเนินงานที่ไม่สามารถดำเนินการกับค่าบางประเภทได้ ในกรณีนี้ ข้อผิดพลาดประเภทของเราเกี่ยวข้องกับค่าสตริง
Python มีหลายวิธีที่คุณสามารถจัดรูปแบบสตริงได้ วิธีนี้ทำให้คุณสามารถแทรกค่าลงในสตริงหรือเชื่อมค่าที่ส่วนท้ายของสตริงได้
สองวิธีทั่วไปในการจัดรูปแบบสตริงคือ:
- การใช้ตัวดำเนินการ % (แบบเก่า)
- การใช้ตัวดำเนินการ {} กับฟังก์ชัน .format()
เมื่อคุณพยายามใช้ทั้งสองรูปแบบร่วมกัน จะเกิดข้อผิดพลาด
ตัวอย่าง:การผสมกฎการจัดรูปแบบสตริง
มาเขียนโปรแกรมคำนวณการขึ้นราคา 5% สำหรับสินค้าที่ขายในร้านเบเกอรี่กัน
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
เราเริ่มต้นด้วยการรวบรวมข้อมูลสองส่วนจากผู้ใช้:ชื่อผลิตภัณฑ์และราคาของผลิตภัณฑ์ เราทำสิ่งนี้โดยใช้คำสั่ง input():
name = input("Enter the name of the product: ") price = input("Enter the price of the product: ")
ต่อไป เราจะคำนวณราคาใหม่ของผลิตภัณฑ์โดยการคูณมูลค่าของ "ราคา" ด้วย 1.05 นี่แสดงถึงการเพิ่มขึ้นของราคา 5%:
increase = round(float(price) * 1.05, 2)
เราปัดเศษค่าของ "เพิ่มขึ้น" เป็นทศนิยมสองตำแหน่งโดยใช้คำสั่ง round() สุดท้าย ใช้การจัดรูปแบบสตริงเพื่อพิมพ์ราคาใหม่ของผลิตภัณฑ์ไปยังคอนโซล:
print("The new price of {} is ${}. " % name, str(increase))
รหัสนี้เพิ่มค่าของ "ชื่อ" และ "เพิ่มขึ้น" ลงในสตริงของเรา เราแปลง "เพิ่ม" เป็นสตริงเพื่อรวมเข้ากับสตริงของเรา ก่อนที่เราจะแปลงค่า "เพิ่มขึ้น" เป็นตัวเลขทศนิยม เรียกใช้โค้ดของเราและดูว่าเกิดอะไรขึ้น:
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
Python ใช้เครื่องหมายเปอร์เซ็นต์ (%) เพื่อคำนวณตัวเลขโมดูโลและการจัดรูปแบบสตริง หมายเลขโมดูโล่คือตัวเลขที่เหลือหลังจากผลรวมหาร
ถ้าคุณใช้เครื่องหมายเปอร์เซ็นต์บนสตริง เครื่องหมายนั้นจะถูกใช้สำหรับการจัดรูปแบบ ถ้าคุณใช้เครื่องหมายเปอร์เซ็นต์กับตัวเลข จะใช้ในการคำนวณโมดูโล ดังนั้น หากค่าถูกจัดรูปแบบเป็นสตริงที่คุณต้องการคำนวณแบบโมดูโล จะเกิดข้อผิดพลาดขึ้น
ดูโปรแกรมที่คำนวณว่าตัวเลขเป็นคี่หรือคู่:
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.")
ขั้นแรก เราขอให้ผู้ใช้ป้อนตัวเลข จากนั้นเราใช้ตัวดำเนินการโมดูโลเพื่อคำนวณส่วนที่เหลือที่ส่งคืนเมื่อ "ตัวเลข" หารด้วย 2
หากค่าที่ส่งคืนโดยตัวดำเนินการโมดูโลเท่ากับ 0 เนื้อหาของ if
ของเรา คำสั่งดำเนินการ มิฉะนั้น เนื้อหาของ 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” เป็น float โดยใช้ฟังก์ชัน float():
mod_calc = float(number) % 2
มาลองรันโค้ดของเรากันอีกครั้ง:
Please enter a number: 7 This number is odd.
รหัสของเราใช้งานได้!
บทสรุป
ข้อผิดพลาด "ไม่ใช่อาร์กิวเมนต์ทั้งหมดที่แปลงระหว่างการจัดรูปแบบสตริง" เกิดขึ้นเมื่อ Python ไม่ได้เพิ่มอาร์กิวเมนต์ทั้งหมดลงในการดำเนินการรูปแบบสตริง สิ่งนี้จะเกิดขึ้นหากคุณผสมไวยากรณ์การจัดรูปแบบสตริงหรือหากคุณพยายามดำเนินการโมดูโลในสตริง
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปของ Python เหมือนกับวิศวกรซอฟต์แวร์มืออาชีพแล้ว!