Python 3.x 为什么f字串上的间距是奇数

Python 3.x 为什么f字串上的间距是奇数,python-3.x,decorator,spacing,functools,f-string,Python 3.x,Decorator,Spacing,Functools,F String,休息了一会,决定调整一下我的2秒装饰师,期待着早春的到来(祝你好运)。在添加雨伞20分钟后(你可能必须用另一个UTF-8字符替换它们),第一行让我抓狂,不管我在绳子上扔了什么“我希望它能这样工作”的东西 最后,使用+操作符(第二行)修复了我的问题,尽管它不能用于第一次分离。所以,我问你:为什么间距会变小(当两个串联运算符都相同时),以及为什么这种非标准方法会起作用 from functools import wraps def dasher(f): @wraps(f) def

休息了一会,决定调整一下我的2秒装饰师,期待着早春的到来(祝你好运)。在添加雨伞20分钟后(你可能必须用另一个UTF-8字符替换它们),第一行让我抓狂,不管我在绳子上扔了什么“我希望它能这样工作”的东西

最后,使用
+
操作符(第二行)修复了我的问题,尽管它不能用于第一次分离。所以,我问你:为什么间距会变小(当两个串联运算符都相同时),以及为什么这种非标准方法会起作用

from functools import wraps

def dasher(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        brella = '\U00002602'
        print(f"{brella} #", f"{brella} # "*8, f"{brella}")
        print(f"{brella} #", f"{brella} # "*8 + f"{brella}") # concat and crazy
        # print("\U00002602 #","\U00002602 # "*8,"\U00002602")
        # print(f"\U00002602 #",f"\U00002602 # "*8,f"\U00002602")

        print()
    return wrapped

@dasher
def dashed():
    pass

dashed()

☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ #  ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂

Pythonic重构

多亏了Chris Doyle在评论中的回答,在解释了
+
之间的间距差异后,下面的内容再次让事情变得复杂,但扩展了可用性,说明了间距,同时避免了
sep='
的需要

输出:

☂ # ☂ # ☂ # ☂ xx ☂ xx ☂ xx ☂ xx ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ o ☂ xx ☂ xx ☂ xx ☂ xx ☂ o ☂ # ☂ # ☂ 

当您将多个项目传递给DEAFULT打印时,打印将使用空格作为分隔符。因此,当您给出第一个字符串时,以
结尾。然后用逗号跟在后面,并传入下一个要打印的项目(因为打印项目的默认分隔符是空格,所以第一个项目和第二个项目将用空格分隔。因此您将使用
散列
空格

但是,您乘的第二个字符串以空格结尾。然后,您给第三个项目加逗号。因此,您的第二个项目以空格结尾,然后打印将放在第二个和第三个项目之间的空格中。这导致您有一个双空格。因此,您将有
哈希
空格
空格
空格>

如果不希望出现这种情况,请手动在第一个项目的末尾添加空格,使其与第二个项目一致,第二个项目以空格结尾,然后在打印结束时将分隔符设置为空字符串

或者,您可以将
brella
乘以10,然后使用“#”作为连接符来连接它们

brella='\U00002602'
打印(f“{brella}#”,f“{brella}#”*8,f“{brella}”)
打印(f“{brella}#”,f“{brella}#”*8+f“{brella}”)
打印(f“{brella}#”,f“{brella}#”*8,f“{brella}”,sep=”)
打印('#'.join(brella*10))
输出

☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ #  ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂

当您传递多个项目进行打印时(即默认情况下以逗号分隔打印将在它们之间留出一个空格)因此,当您将内部brella相乘时,您会在每个字符串的末尾加上一个空格,然后使用一个
,因此print会在其中加上另一个空格,因此
不是concat运算符。print是python 3中的一个函数。因此调用
print(“foo”,“bar”)
正在向print传递2个字符串参数。print函数随后会将这些参数与
sep
的值连接起来,除非您更改它,否则sep是一个空格。调用print(“foo”+“bar”)将导致两个字符串首先连接在一起,然后将单个字符串参数传递到打印。因此,
+
在这里都不是串联运算符。谢谢。
sep='
完全不在我的考虑范围内。解释非常好,非常有用。当然,您可以编写得更加简洁只需将brella乘以10,然后使用“#”作为它们之间的连接符
print(“#”.join(brella*10))
,这会让人感觉更像蟒蛇,并颠覆了快速和肮脏的方法,让人觉得它既快又干净。
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ #  ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂
☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂ # ☂