2015-09-07 72 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__用于添加和乘法。

相关问题