Python 为什么格式化字符串在{花括号}中包含变量或操作之前不需要进行类型转换?
正如您所知,python是一种强类型语言,它不允许将Python 为什么格式化字符串在{花括号}中包含变量或操作之前不需要进行类型转换?,python,Python,正如您所知,python是一种强类型语言,它不允许将int类型与str类型串联在一起 正如你在下面看到的;如上所述,python不允许此类操作(由于该语言的特性,str与int的连接) 但也要看看这一点: a = 1 b = '2' print(f"{a} and {b}") print("{} and {}".format(a, b))#or this for example 在这里,我没有转换分配了int类型的变量a;转换为字符串,但我可以将其包含在格式化字符串中 我的问题是。。。当pyt
int
类型与str
类型串联在一起
正如你在下面看到的;如上所述,python不允许此类操作(由于该语言的特性,str与int的连接)
但也要看看这一点:
a = 1
b = '2'
print(f"{a} and {b}")
print("{} and {}".format(a, b))#or this for example
在这里,我没有转换分配了int
类型的变量a;转换为字符串,但我可以将其包含在格式化字符串中
我的问题是。。。当python解释器遇到这个表达式print(f“{a}和{b}”)
当python解释器遇到这个表达式时,在幕后会发生什么print(f“{a}和{b}”)
发生的情况是,在a
和b
内置到字符串中之前,调用str(a)
和str(b)
。当您构建这样的两个类时,您可以看到这一点:
class Test1(object):
pass
class Test2(object):
def __str__(self):
return "surprise"
当调用str(Test2())
时,返回的“惊喜”
当你想说服自己时,尝试以下方法:
t1 = Test1()
t2 = Test2()
print(t1)
print(t2)
print(f"{t1}")
print(f"{t2}")
print("{}".format(t1))
print("{}".format(t2))
每次打印相同的两行
当python解释器遇到这个表达式时,在幕后会发生什么print(f“{a}和{b}”)
发生的情况是,在a
和b
内置到字符串中之前,调用str(a)
和str(b)
。当您构建这样的两个类时,您可以看到这一点:
class Test1(object):
pass
class Test2(object):
def __str__(self):
return "surprise"
当调用str(Test2())
时,返回的“惊喜”
当你想说服自己时,尝试以下方法:
t1 = Test1()
t2 = Test2()
print(t1)
print(t2)
print(f"{t1}")
print(f"{t2}")
print("{}".format(t1))
print("{}".format(t2))
每次打印相同的两行。记录在:
如果指定了转换,则在格式化之前将转换表达式的计算结果。转换“!s'
调用结果,!r'
调用,和'!一个“
调用
如果未指定转换,则立即继续执行以下步骤:
然后使用协议对结果进行格式化。格式说明符传递给表达式或转换结果的方法。省略格式说明符时,将传递空字符串。格式化后的结果将包含在整个字符串的最终值中
\uuuu format\uuuu()
方法随后遵循语法来确定结果字符串表示形式
在您的例子中,结果与对变量调用str()
相同,但这并不适用于所有变量。在此基础上,这里有一个小演示来说明区别:
类测试:
定义(自我):
返回“惊喜”
定义格式(自我,格式规格):
返回“测试”
t1=测试()
打印(t1)
打印(str(t1))
打印(f“{t1}”)
打印(“{}”。格式(t1))
>>>惊喜
>>>惊喜
>>>试验
>>>试验
这一点记录在:
如果指定了转换,则在格式化之前将转换表达式的计算结果。转换“!s'
调用结果,!r'
调用,和'!一个“
调用
如果未指定转换,则立即继续执行以下步骤:
然后使用协议对结果进行格式化。格式说明符传递给表达式或转换结果的方法。省略格式说明符时,将传递空字符串。格式化后的结果将包含在整个字符串的最终值中
\uuuu format\uuuu()
方法随后遵循语法来确定结果字符串表示形式
在您的例子中,结果与对变量调用str()
相同,但这并不适用于所有变量。在此基础上,这里有一个小演示来说明区别:
类测试:
定义(自我):
返回“惊喜”
定义格式(自我,格式规格):
返回“测试”
t1=测试()
打印(t1)
打印(str(t1))
打印(f“{t1}”)
打印(“{}”。格式(t1))
>>>惊喜
>>>惊喜
>>>试验
>>>试验
格式化字符串不同于使用算术运算符。我并不声称知道Python中字符串格式化和f
字符串实际上是如何工作的,但一种似乎合理的可能方式是,这是一个两步过程:首先f{a}和{b}
被简单地翻译成“{}和{}”。格式(a,b)
;然后,format
函数遍历格式化字符串,当它看到一个{}
时,它将相应的参数转换成一个字符串(如果可能的话),并用该字符串替换{}
。如果你想知道它是如何工作的,Python是开源的,所有的源代码都可以供任何人阅读,pythons中的所有东西都是一个对象,它们是通过对象类的\uu str\uuuu(self)
方法字符串化的。@brunodesshuilliers嗯,我听说f字符串实际上更快。如果它只是一个语法糖,这是不可能的,对吗?格式化字符串不同于使用算术运算符。我并不声称知道Python中的字符串格式化和f
字符串实际上是如何工作的,但一种可能的方法似乎是合理的,它是一个两步过程:首先f{a}和{b}
被简单地翻译成“{}和{}”。格式(a,b)
;然后,format
函数遍历格式化字符串,当它看到一个{}
时,它将相应的参数转换成一个字符串(如果可能的话),并用该字符串替换{}
。如果你想知道它是如何工作的,Python是开源的,所有的源代码都可以供任何人阅读,蟒蛇的一切都是ob