TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

mong mọi người giúp mình với.vừa rồi mình có viết code trên python nhưng không hiểu sao lại gặp lỗi này. mình có chạy thử trên trang web python online nhưng không vấn đề gì. Hiện tại mình đang chạy trên sublime text 4 và code lỗi nhưng thế này:

from math import sqrt
f1 = open("PTB2.INP","r")
f2 = open("PTB2.OUT","w")
n = f1.readline()
def fd(k):
	dot = k.find(".")
	if len(k[dot:]) <= 2:
		return k + "0" 
for i in range(int(n)):
	t = f1.readline()
	t = t.replace("\n","")
	t = t.split(" ")
	a = float(t[0])
	b = float(t[1])
	c = float(t[2])
	if a == b == c == 0 or a == b ==0:
		f2.write("Vo so nghiem\n")
	elif a == c == 0 or b == c == 0:
		f2.write("0 0\n")
	elif c == 0:
		kq = str(round((-b)/a,2))
		f2.write("0 " + fd(kq) + "\n")
	elif a == 0:
		kq = str(round((-c)/b,2))
		f2.write(fd(kq)+" "+fd(kq)+"\n")
	else:
		dt = b*b-4*a*c
		if dt < 0:
			f2.write("Vo nghiem\n")
		elif dt == 0:
			kq = str((round((-b)/(2*a),2)))
			f2.write(fd(kq)+" "+fd(kq)+"\n")
		else:
			dt = round(sqrt(dt),2)
			kq1 = str(round((-b+dt)/(2*a),2))
			kq2 = str(round((-b-dt)/(2*a),2))
			f2.write(fd(kq1)+" "+fd(kq2)+"\n")                          # dòng này bị lỗi
f1.close()
f2.close()

dòng “f2.write(fd(kq1)+” “+fd(kq2)+”\n")" bị máy báo lỗi “TypeError: unsupported operand type(s) for +: ‘NoneType’ and ‘str’ “, bỏ fd() đi thì không sao, thêm vào là bị như vậy, mặc dù ở phía trên có thêm nhưng vẫn bị lỗi ( chẳng hạn như dòng này f2.write(fd(kq)+” “+fd(kq)+”\n”))
bộ text của mình

7
10.00 0.67 6.00
3.00 1.14 0.33
0.60 6.00 4.00
0.30 1.80 0.67
0.60 0.90 0.83
0.29 2.50 0.433
5.00 0.33 1.25

còn đề thì bảo “tìm nghiệm của phương trình bậc hai, lấy hai chữ số thập phân”
đáp án bộ text trên

Vo nghiem
Vo nghiem
-0.72 -9.28
-0.4 -5.6
Vo nghiem
-0.17 -8.45
Vo nghiem

nếu len(k[dot:]) <= 2 thì mới có kết quả return về từ hàm fd(.), trường hợp không như vậy thì hàm return về None, tức NoneType.

2 Likes

dạ con cám ơn ạ, con bẩy được lỗi rồi ạ

1 Like

vd -54.6
do đề bài yêu cầu làm tròn 2 chứ số thập phân nên con tìm “.” nên mới có dot = k.find(".")
thì con có chạy thử kiểm tra thì kết quả là “.6” nên mới có lệnh if. Nếu lớn hơn 2 như -54.70 thì không thực hiện và giữ nguyên ạ. chỉ có dòng bị lỗi ạ.

Bạn dùng format string thôi: "%.2f" % number. Không cần str(number).

Format trong Python: https://docs.python.org/3/tutorial/inputoutput.html
Format string: https://docs.python.org/3/library/string.html#formatspec

3 Likes

@thanhtrung2314 @rogp10
cám ơn mọi người ạ. Mình bẫy được lỗi rồi
tại phần CTC

def fd(k):
	dot = k.find(".")
	if len(k[dot:]) <= 2:
		return k + "0"

thì phải thêm return k ở phía dưới nữa

def fd(k):
	dot = k.find(".")
	if len(k[dot:]) <= 2:
		return k + "0"
       return k

thì mới đúng vì để trả lại giá trị k chớ không là none :slight_smile:
cám ơn mọi người đã giúp đỡ :+1:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?