Python 带str、float、int和tuple的除法

Python 带str、float、int和tuple的除法,python,python-3.x,Python,Python 3.x,基本上,我希望能够将int、str、tuple和float一分为二。我很难区分输入的类型,然后返回相同的类型 例如,half7应该返回3而不是3.0!,half9.0应返回4.5,Half17应返回seve,half1,2,3,4,5,6,7应返回1,2,3。我已尝试此代码,但未成功: def half(x): """returns half of the input, rounded down str -> str, int -> int, float ->

基本上,我希望能够将int、str、tuple和float一分为二。我很难区分输入的类型,然后返回相同的类型

例如,half7应该返回3而不是3.0!,half9.0应返回4.5,Half17应返回seve,half1,2,3,4,5,6,7应返回1,2,3。我已尝试此代码,但未成功:

def half(x):
    """returns half of the input, rounded down

    str -> str, int -> int, float -> float, tuple -> tuple"""
    return int(x/2)
    if x is float:
        return float(x/2)
    if x is tuple:
        return tuple(x/2)
    if x is str:
        return str(x/2)
Just use,它根据第一个参数的类型选择实现:

from functools import singledispatch

@singledispatch
def half(x):
    raise TypeError()

@half.register(int)
def _(x):
    return x // 2

@half.register(float)
def _(x):
    return x / 2

@half.register(tuple)
def _(x):
    return x[:len(x) // 2]

@half.register(str)
def _(x):
    return x[:len(x) // 2]
如果愿意,您可以将其缩短为将lambda传递给half.register,而不是使用decorator和function语句:

from functools import singledispatch

@singledispatch
def half(x):
    raise TypeError()

half.register(int, lambda x: x // 2)
half.register(float, lambda x: x / 2)
half.register(tuple, lambda x: x[:len(x) // 2])
half.register(str, lambda x: x[:len(x) // 2])
Just use,它根据第一个参数的类型选择实现:

from functools import singledispatch

@singledispatch
def half(x):
    raise TypeError()

@half.register(int)
def _(x):
    return x // 2

@half.register(float)
def _(x):
    return x / 2

@half.register(tuple)
def _(x):
    return x[:len(x) // 2]

@half.register(str)
def _(x):
    return x[:len(x) // 2]
如果愿意,您可以将其缩短为将lambda传递给half.register,而不是使用decorator和function语句:

from functools import singledispatch

@singledispatch
def half(x):
    raise TypeError()

half.register(int, lambda x: x // 2)
half.register(float, lambda x: x / 2)
half.register(tuple, lambda x: x[:len(x) // 2])
half.register(str, lambda x: x[:len(x) // 2])

首先,您需要检查类型。其次,此代码假定您使用的是Python 2

def half(x):

    if type(x) == float:
        return x / 2

    if type(x) == int:
        return x // 2

    if type(x) in (tuple, str):
         return x[:len(x)//2]

首先,您需要检查类型。其次,此代码假定您使用的是Python 2

def half(x):

    if type(x) == float:
        return x / 2

    if type(x) == int:
        return x // 2

    if type(x) in (tuple, str):
         return x[:len(x)//2]

您可以使用dict,type作为键,lambda作为值,使用//for int和/for float,并简单地为str和tuple lenx//2建立索引


您可以使用dict,type作为键,lambda作为值,使用//for int和/for float,并简单地为str和tuple lenx//2建立索引


x是float告诉您x是否与float是完全相同的对象,这是不太可能的。你的意思是如果isinstancex,float,即如果x是float类的实例吗?x是float,它告诉你x是否与float完全相同,这是不太可能的。你的意思是如果isinstancex,float,即如果x是float类的实例吗?isinstancex,float,int在Python3中通常是首选的,4/2==2.0-不是想要的。Jon,如果不是首选的,类型函数的用途是什么?isinstancex,float,int在Python3中通常是首选的,4/2==2.0-不是想要的。Jon,如果不是首选,类型函数的用途是什么?它将是导入数字和str,因为python3中没有基串。它将是导入数字和str,因为python3中没有基串