2015-02-11 63 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