2015-09-07 71 views
0

假設我們定義的函數如下:爲什麼Python允許str與int相乘?

def multiply(a, b): 
    return a * b 

通過將數字調用它的工作原理很明顯:

In [5]: multiply(2,3) 
Out[5]: 6 

但是這(奇怪)的作品,以及知道Python是一種強類型語言:

In [6]: multiply('2', 3) 
Out[6]: '222' 

或本

In [7]: multiply(3, '2') 
Out[7]: '222' 

隱式類型轉換讓我非常害怕。 str型號設計決定的基本原理是什麼?在F#,而另一方面,它是不允許的:

- '3' * 2;; 
    '3' * 2;; 
    ------^ 
/Users/Pac/stdin(14,7): error FS0001: The type 'int' does not match the type 'char' 
+3

沒有類型轉換正在進行。將一個字符串與一個整數相乘是一個古老且衆所周知的功能,它只是簡單地複製字符串(所以沒有轉換)。所以例如''foo'* 3'變成'foofoofoo'。 –

+2

我最喜歡的用法是在命令行腳本中寫出分隔符:'print'='* 79' – chucksmash

回答

2

這是一個Python的特點,注意3 * '2'6。它將字符串的內容乘以3次。

另一個(有用的)例如:

>>> [2] * 3 
[2, 2, 2] 

知道Python是一種強類型語言:

是它的強類型,因此,例如'3' + 2不作爲止跌工作沒有任何意義。然而,不同類型的乘法是有用的 - 不幸的是,如果你看到一個操作符由於強類型而失敗,那麼它就是一個不一致的地方,你也可以期待這個。

0

由於@Joachim Pileborg指出,這不是類型轉換的示例。相反,它或多或少與用於描述有限符號序列的標準符號一致。如果您參考有限自動機之類的教科書,x^i爲整數i表示字符串的連接xi次。還可以比較x + y常用於連接字符串xy(也在Python中)。在這種表示法,x + x == 2 * x

4

沒有類型轉換是怎麼回事,但字符串類型有很多,其提供有用的快捷鍵是很合乎邏輯的操作,當你想想看:

  • * =重複這樣'abcd ' * 4- >'abcd abcd abcd abcd '
  • 添加+ =串連所以'abcd' + 'efg'- >'abcdefg''abcd' + 3- >TypeError: cannot concatenate 'str' and 'int' objects

,找出哪些操作是可用於任何給定類型的招數是,除了閱讀本手冊,dir(x)help(x)其中x是一個實例的類型,所以:

dir('a') 
__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __format__, 
__ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__, 
__hash__, __init__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, 
__reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, 
__sizeof__, __str__, __subclasshook__, _formatter_field_name_split, _formatter_parser, 
capitalize, center, count, decode, encode, endswith, expandtabs, find, format, index, 
isalnum, isalpha, isdigit, islower, isspace, istitle, isupper, join, ljust, 
lower, lstrip, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, 
split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill 

正如你可以看到這個包含了運營商__add____mul__用於添加和乘法。

相關問題