繁体   English   中英

与int和str的乘法

[英]Multiplication with int and str

对于这个看似简单的问题,我完全感到困惑。 我想定义一个将接受输入的函数,可以是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

关于什么:

def double(x):
    return x+x

要么

def double(x):
    return x*2

两者都应作为:

  • 当参数是字符串时, +运算符会重载以执行串联;
  • 当一个参数为字符串时, *运算符将重载为“重复”。

由于Python是动态类型的,因此将在运行时根据操作数的类型来选择执行的实际操作。


更正式地,引用文档

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

[...]

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


如果您感到好奇,请从源代码或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 ,它将尝试将左操作数解释为一个序列并执行连接。

只需将输入乘以2。 如果是字符串,它将连接两次。 如果是数字,它将翻倍。

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

查看Python文档。 这是直接从中获取的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM