1行函数获取中间字母,语法错误

时间:2019-05-09 09:50:05

标签: python python-3.x

尝试编写单行函数,该函数将采用输入字符串并根据字符串是均匀还是不均匀来获得中间字母/字母。我收到一个错误代码,表示else if之后的第一个镜头存在语法错误。第三行代码应在第二行继续。

代码:

PIL

错误:

def get_middle(s):
    return m = s[int(len(s/2))] if type(len(s)/2) is float else if 
    s[int(len(s)/2)-1:int(len(s)/2)]

3 个答案:

答案 0 :(得分:4)

type(len(s)/2) is float并不是对偶数长度的校验,如下所示,对于您所进行的校验,偶数和奇数字符串长度都评估为True,因为两个除法都是浮点值
4/2 = 2.05/2=2.5

In [16]: s = 'abcd'                                                                                                                                                               

In [17]: type(len(s)/2) is float                                                                                                                                                  
Out[17]: True

In [18]: s = 'abcde'                                                                                                                                                              

In [19]: type(len(s)/2) is float                                                                                                                                                  
Out[19]: True

为什么不简单地通过将偶数/奇数长度的2除数进行检查。 检查数字的长度是否为奇数或偶数,并相应地选择中间字符。

def get_middle(s):

    #If even length, select 2 characters
    if len(s)%2 == 0:
        return s[int(len(s)/2)-1:int(len(s)/2)+1]
    #If odd length, select 1 character
    else:
        return s[int(len(s)/2)]

print(get_middle('a'))
print(get_middle('ab'))
print(get_middle('abc'))
print(get_middle('abcd'))
print(get_middle('abcde'))

输出将为

a
ab
b
bc
c

从这里开始,我们可以轻松地编写一根衬纸

def get_middle(s):

    return s[int(len(s)/2)-1:int(len(s)/2)+1] if len(s)%2 == 0 else s[int(len(s)/2)]

答案 1 :(得分:2)

评论和其他答案中的人已经回答了您的问题,但是我想通过一些生活方式建议来扩展他们。是的,当前的问题是您不应该在结尾加上else if,正确的语法是foo if condition else bar。而且type(len(s)) is Float是检查奇数的一种荒谬方法。希望您已经从评论中得到了答案。

但是,我想争辩说,只写一行就可以吹嘘自己有多聪明,这是非常有害的做法。 Programs must be written for people to read, and only incidentally for machines to execute。除非您能真正使一根衬套易于理解,否则像您一样编写它是没有意义的-宁愿多行编写它以使任何错误显而易见。宁愿思考其他将要阅读此代码的人,而不是“哦,看看那有多酷”。

现在,如果您真的坚持编写简短的代码,那没关系,这是您实际上可以将其重写为有意义的衬砌的方法:

from math import ceil

def get_middle(s):
    return s[ceil(len(s)/2 - 1): ceil(len(s)/2)]

我会让你弄清楚为什么它自己可以工作。

答案 2 :(得分:0)

您的代码有语法错误,因为if不能在第二行,除非您转义新行并且只有expr if cond else expr是有效的内联if语句:

foo() if condition \
     else bar()

您可能会喜欢:onelinerizer


原始帖子的偶数/奇数检查还有另一个问题。一行解决:

def get_middle(s):
    return m = s[int(len(s/2))] if len(s)%2 != 0 else s[int(len(s)/2)-1:int(len(s)/2)]

这里使用%2来获得余数。

尽管有评论说int(len(s)/2)会失败,但就我所知,它等同于len(s)//2也不保证一定是分裂的底线:

def get_middle(s):
    return m = s[len(s)//2] if len(s)%2 != 0 else s[len(s)//2-1:len(s)//2]