Skip to main content
 首页 » 编程设计

python之用 str、float、int 和元组除法

2025年05月04日10shanyou

基本上,我希望能够将 int、str、tuple 和 float 分成两半。我在区分输入类型然后返回相同类型时遇到问题。

例如,half(7) 应该返回 3(不是 3.0!),half(9.0) 应该返回 4.5,half("seventeen") 应该返回 "seve",half((1,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) 

请您参考如下方法:

只需使用 functools.singledispatch , 它根据第一个参数的类型选择实现:

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 而不是使用装饰器和函数语句:

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])