Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python typeerror:ไม่ได้แปลงอาร์กิวเมนต์ทั้งหมดระหว่างการจัดรูปแบบสตริง

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 เหมือนกับวิศวกรซอฟต์แวร์มืออาชีพแล้ว!