最近我尝试学习编程,在完成第一个教程后,我正在尝试解决codewars.com上的一些问题。
"你将得到一个单词。你的工作是返回单词的中间字符。如果单词的长度是奇数,则返回中间字符。当单词的长度为偶数时,则返回两个中间字符。">
这是我的解决方案:
def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)/2) - 1] and n[(len(n)/2)]
else:
return n[(len(n)/2) + 0.5]
不幸的是,当用"abc"执行函数时,我总是得到:
Traceback (most recent call last) <ipython-input-24-46429b2608e5> in <module>
----> 1 print(get_middle("abc"))
<ipython-input-23-56ccbf5e17f7> in get_middle(n)
3 return n[(len(n)/2) - 1] and n[(len(n)/2)]
4 else:
----> 5 return n[(len(n)/2) + 1]
TypeError: string indices must be integers
我不明白为什么我总是犯这种错误。我所有的字符串索引不是整数吗?我知道有很多不同的解决方案,但我真的很想知道为什么我的解决方案没有按照我想要的方式工作
提前感谢!
在Python中,有两种除法:整数除法和浮点除法。
print(4 / 2)
---> 2.0
print(4 // 2)
---> 2
在Python 2中,将一个整数除以另一个整数,得到一个整数。由于Python没有预先声明数据类型,解释器会自动检测类型,因此您永远不知道何时要使用整数,何时要使用浮点。
由于浮点数会失去精度,因此不建议在积分计算中使用浮点数
为了解决这个问题,未来的Python模块包括一种称为整数除法的新型除法,由运算符//给出
现在,/执行-浮点除法,并且//执行-整数除法。
def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)//2) - 1] and n[(int(len(n)/2))]
else:
return n[int(len(n)/2+ 0.5)]
我们代码的问题是division自动将integer转换为float类型,Python开始抱怨它。简单的解决方案是在division中添加第二个/
符号,或者在else
的情况下将其转换为integer:
def get_middle(n):
if len(n) % 2 == 0:
return n[(len(n)//2) - 1] and n[(len(n)//2)]
else:
return n[int((len(n)/2) + 0.5)]
试试math.floor:
import math
def get_middle(value):
length = len(value)
if length % 2 == 0:
# even length, pick the middle 2 characters
start = length // 2 - 1
end = length // 2 + 1
else:
# odd length, pick the middle character
start = math.floor(length // 2)
end = start + 1
return value[start:end]
一个建议是,如果你正在学习编程,试着分解你的步骤,而不是一行完成所有步骤,这在试图理解错误信息时会有很大帮助。
如果用/
运算符将奇数整数除以2,则得到浮点值。当这个浮点值用作标记时,应该显式地将其转换为整数。