Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么格式化字符串在{花括号}中包含变量或操作之前不需要进行类型转换?_Python - Fatal编程技术网

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

正如您所知,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;转换为字符串,但我可以将其包含在格式化字符串中

我的问题是。。。当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