Python中的星号符号
我在研究一些不同的方法来解决经典的嘶嘶声问题,无意中发现了这个问题:Python中的星号符号,python,operators,operator-overloading,Python,Operators,Operator Overloading,我在研究一些不同的方法来解决经典的嘶嘶声问题,无意中发现了这个问题: for i in xrange(1, n+1): print "Fizz"*(i%3 == 0) + "Buzz"*(i%5 == 0) or i 星号是否是if语句的简写?如果是,此符号是否特定于打印 提前感谢。Python中的星号实际上只是标准的乘法运算符*。它映射到操作它的对象的方法,因此可以重载以具有自定义含义。这与if或print无关 在字符串(str和unicode)的情况下,它已被重载/重写以表示字符串
for i in xrange(1, n+1):
print "Fizz"*(i%3 == 0) + "Buzz"*(i%5 == 0) or i
星号是否是if
语句的简写?如果是,此符号是否特定于打印
提前感谢。Python中的星号实际上只是标准的乘法运算符
*
。它映射到操作它的对象的方法,因此可以重载以具有自定义含义。这与if
或print
无关
在字符串(str
和unicode
)的情况下,它已被重载/重写以表示字符串的重复,因此“foo”*5
的计算结果为“foooo”
而“Fizz”*(i%3==0)
只是一个“智能”的缩写:
"Fizz" if i % 3 == 0 else ""
这是因为表达式i%3==0
的计算结果是布尔值,而布尔值是Python中整数的一个子类型,因此True==1
和False==0
,因此,如果将字符串与布尔值“相乘”,则将得到相同的字符串或空字符串
注意:我还想指出,根据我的经验/理解,Python不鼓励这种类型的编程风格,因为它使代码可读性降低(无论是新手还是老手),而且速度也不会更快(事实上,可能更慢;请参阅快速基准测试(但有趣的是,不是PyPy:)
和
*
也适用于列表
和元组
的实例:
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> (1, 2, 3) * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
您还可以为您的类型定义自己的
*
运算符,具体操作如下:
产出:
called <__main__.Foo object at 0x10426f090> with 'hello'
…但请不要这样做:)(事实上,完全清除子类化具体类型并没有坏处!)asterik在python中用于乘法。如果它对字符串有效,它会将字符串重复到指定的数字。例如
print "test"*0
print "test"*1
print "test"*2
产出:
<blank line>
test
testtest
如果Fizz
或Buzz
为非零/真,python甚至不会计算i
当i乘以3时,Fizz
成为现实(因此,它为所有i值输出3,可除以3)
类似地,Buzz
对于所有5次乘法都是正确的。
Fizz
和Buzz
当我可以除以15时输出。
当上述两个条件都为False时,i被计算并打印。可能还需要指出布尔值(
True
和False
)也是整数(1
和0
)。所以“foo”*True
是“foo”
,而“foo”*False
是一个空字符串。您提到这一点时,我正在添加该部分。@alecxe:运算符重载不是一个不相关的标记;这在Python中起作用的原因正是因为运算符重载。
class MyTrickyInt(int):
def __mul__(self, other):
return int.__mul__(self, other) - 1
def __add__(self, other):
return int.__add__(self, other) * -1
print MyTrickInt(3) * 4 # prints 11
print MyTrickyInt(3) + 2 # prints -5
print "test"*0
print "test"*1
print "test"*2
<blank line>
test
testtest
print "Fizz"*(i%3 == 0) + "Buzz"*(i%5 == 0) or i