gpt4 book ai didi

python - Python 中的星号

转载 作者:太空狗 更新时间:2023-10-30 01:58:48 24 4
gpt4 key购买 nike

我正在研究一些不同的方法来解决经典的 FizzBu​​zz 问题,并偶然发现了这个:

for i in xrange(1, n+1):
print "Fizz"*(i%3 == 0) + "Buzz"*(i%5 == 0) or i

星号是 if 语句的简写吗?如果是这样,这个符号是否特定于 print

提前致谢。

最佳答案

Python 中的星号实际上只是标准的乘法运算符*。它映射到 __mul__它所操作的对象的方法,因此可以重载以具有自定义含义。这与 ifprint 无关。

对于字符串(strunicode),它已被重载/覆盖以表示重复字符串,例如 "foo"* 5 的计算结果为 "foofeofoofoofoo"

>>> 'foo' * 5  # and the other way around 5 * "foo" also works
'foofoofoofoofoo'

"Fizz"* (i % 3 == 0) 只是一个“智能”简写:

"Fizz" if i % 3 == 0 else ""

这是因为表达式 i % 3 == 0 的计算结果为 bool 值,而 bool 值是 Python 中整数的子类型,因此 True == 1False == 0,因此如果您将一个字符串与一个 bool 值“相乘”,您将得到相同的字符串或空字符串。

注意:我还想指出,根据我的经验/理解,这种类型的编程风格在 Python 中不被鼓励——它降低了代码的可读性(对新手和老手来说) ...


并且 * 也适用于 listtuple 的实例:

>>> [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)

您还可以为您的类型定义自己的 * 运算符,使用相当于 http://pastebin.com/Q92j8qga 的运算符:

class Foo(object):
def __mul__(self, other):
return "called %r with %r" % (self, other)

print Foo() * "hello" # same as Foo().__mul__("hello")

输出:

called <__main__.Foo object at 0x10426f090> with 'hello'

* 映射到 __mul__ 的情况也适用于“原始”类型,例如 intfloat 和其他运算符,所以 3 * 4 等同于 (3).__mul__(4) (其他运算符也一样)。事实上,您甚至可以子类化 int 并为 * 提供自定义行为:

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

...但请不要那样做 :)(事实上,完全不对具体类型进行子类化并没有坏处!)

关于python - Python 中的星号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com