【问题标题】:How does an asterisk `*` work in the string formatting method `.format(*) ` in Python 3?星号 `*` 在 Python 3 中的字符串格式化方法 `.format(*) 中如何工作?
【发布时间】:2018-09-24 08:29:27
【问题描述】:

.format(*) 中的* 有什么用? 在print(new_string.format(*sum_string)) 下面的格式函数中使用它时,它会将输出中 sum_string 的值从 18 更改为 1 为什么会这样? 我已阅读以下有关 *args**kwargs 的链接,但不明白它如何应用于 .format() 函数

What does ** (double star/asterisk) and * (star/asterisk) do for parameters?

sum_string = "18"
new_string = "This is a new string of value {}"

print(new_string.format(sum_string)) #it provides an output of value 18
print(new_string.format(*sum_string)) #it provides an output of value 1

【问题讨论】:

标签: python python-3.x string-formatting args string.format


【解决方案1】:

它与format 无关。 * 解包参数,因此如果列表中有 4 个占位符和 4 个元素,则 format 解包 args 并填充插槽。示例:

args = range(4)
print(("{}_"*4).format(*args))

打印:

0_1_2_3_

在你的第二种情况下:

print(new_string.format(*sum_string))

unpack 的参数是字符串的 characters(字符串被参数 unpacking 视为可迭代),并且由于只有一个占位符,因此只有第一个字符被格式化和打印 (与 C 编译器和 printf 可能会收到的警告相反,python 不会警告您参数列表太长,它只是不会使用所有参数)

有几个占位符你会看到这个:

>>> args = "abcd"
>>> print("{}_{}_{}_{}").format(*args))
a_b_c_d

【讨论】:

  • 是的,只是为了说明您所描述的内容:new_string = "This is a new string of value {}{}"new_string.format(*sum_string) 将在出现 2 个占位符时“工作”。
  • 您对拆包是对的,但"{}_"*4 与拆包无关。它只是字符串乘法,因此是一种连接形式。 "{}_"*4"{}_" + "{}_" + "{}_" + "{}_" 相同,与"{}_{}_{}_{}_" 相同,后者仅由.format 处理以填充插槽。更重要的是,这种乘法可以应用于所有可以连接的对象。所以(1,) * 3 将产生(1, 1, 1)。需要记住的一点是,这种连接也会复制指针,因此您必须小心连接可变对象(例如列表)。
  • 我可以改变它,它只是为了快速生成一个格式化字符串
  • 谢谢,我对元组感到困惑;我认为(20, 100, 1.0) 可能需要三个不同的占位符,但现在我明白了,在不指定* 的情况下,整个元组只替换为一个占位符并替换为三个不同的占位符,它需要使用@ 解包987654340@或*args
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2019-05-25
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多