2015-02-11 30 views
0

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

这是我到目前为止有:

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 
+0

让你的*试图*乘以2? Python中的''foo'* 2 =='foofoo''和 '4 * 2 == 8''。 – 2015-02-11 21:41:53

+0

Python是动态类型的,'*'运算符适用于整数和字符串,所以你不需要关心函数的输入是什么。 – eigenchris 2015-02-11 21:42:18

+0

见下文Jared。 – 2015-02-11 21:44:44

回答

4

什么:

def double(x): 
    return x+x 

def double(x): 
    return x*2 

双方应努力:

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

对于Python是动态类型,所执行的实际操作的选择将在运行时进行,这取决于操作数的类型。


更正式,引用the documentation

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

[...]

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


如果你好奇,从源头上或Python3.3.6/Objects/abstract.c(用于PyNumber_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

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

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

查看Python文档。这是直接从它。

字符串可以连接在一起(粘在一起)与+操作,且反复使用*

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

谢谢,过一次脑屁 – holaprofesor 2015-02-11 22:22:45