使用int和str进行乘法运算

时间:2015-02-11 21:40:34

标签: python python-3.x

我对这个看似简单的问题感到十分困惑。我想定义一个将接受输入的函数,它可以是str或int并加倍。例如,如果输入为'foo',则输出将为'foofoo'。同样,如果输入是(9),输出将是18.有人能指出我正确的方向吗?

这是我到目前为止所做的:

def double(x):
    """returns two times a number if input is a number, returns double the size of the string inputted, if input is a string
str -> str; int -> int"""
    if x is :
        return x*2
    if x is :
        return x*2

2 个答案:

答案 0 :(得分:4)

怎么样:

def double(x):
    return x+x

def double(x):
    return x*2

两者都应该如下:

  • 当参数是字符串时,+运算符被重载以执行连接;
  • *运算符重载为"重复"当一个参数是一个字符串时。

由于Python是动态类型的,所以 real 操作的选择将在运行时进行,具体取决于操作数的类型。


更正式地引用the documentation

  

*(乘法)运算符产生其参数的乘积。 参数必须都是数字,或者一个参数必须是整数,另一个必须是序列。在前一种情况下,数字被转换为通用类型,然后相乘。在后一种情况下,执行序列重复;负重复因子产生一个空序列。

     

[...]

     

+(加法)运算符产生其参数的总和。 参数必须都是数字或两者都是相同类型的序列。在前一种情况下,数字将转换为通用类型,然后一起添加。在后一种情况下,序列是连接的。


如果您有兴趣,可以从来源或Python3.3.6/Objects/abstract.cPyNumber_Mul的代码具有可比性):

PyObject *
PyNumber_Add(PyObject *v, PyObject *w)
{
    PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
    if (result == Py_NotImplemented) {
        PySequenceMethods *m = v->ob_type->tp_as_sequence;
        Py_DECREF(result);
        if (m && m->sq_concat) {
            return (*m->sq_concat)(v, w);
        }
        result = binop_type_error(v, w, "+");
    }
    return result;
}

如您所见,解释器将首先尝试使用为左操作数定义的特殊方法__add__执行添加。如果这个返回NotImplemented,它将尝试将左操作数解释为序列并执行连接。

答案 1 :(得分:1)

将输入乘以2。如果它是一个字符串,它将连接两次。如果它是一个数字,它将加倍。

user = raw_input('Enter input: ')
print user * 2

查看Python文档。这是直接的。

  

字符串可以与+运算符连接(粘合在一起),并使用*重复:

>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'