我对这个看似简单的问题感到十分困惑。我想定义一个将接受输入的函数,它可以是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
答案 0 :(得分:4)
怎么样:
def double(x):
return x+x
或
def double(x):
return x*2
两者都应该如下:
+
运算符被重载以执行连接; *
运算符重载为"重复"当一个参数是一个字符串时。由于Python是动态类型的,所以 real 操作的选择将在运行时进行,具体取决于操作数的类型。
更正式地引用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 :(得分:1)
将输入乘以2。如果它是一个字符串,它将连接两次。如果它是一个数字,它将加倍。
user = raw_input('Enter input: ')
print user * 2
查看Python文档。这是直接的。
字符串可以与
+
运算符连接(粘合在一起),并使用*
重复:
>>> # 3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'