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