Python2.6引入了str.format()方法,其语法与现有的%运算符略有不同.哪一种更好,适用于什么情况?

Python3.6现在通过语法f"my string"引入了字符串文字(也称为"f"字符串)的另一种字符串格式化格式.此格式选项是否比其他选项更好?

  1. 下面使用的每种方法都有相同的结果,那么有什么区别呢?

     #!/usr/bin/python
     sub1 = "python string!"
     sub2 = "an arg"
    
     sub_a = "i am a %s" % sub1
     sub_b = "i am a {0}".format(sub1)
     sub_c = f"i am a {sub1}"
    
     arg_a = "with %(kwarg)s!" % {'kwarg':sub2}
     arg_b = "with {kwarg}!".format(kwarg=sub2)
     arg_c = f"with {sub2}!"
    
     print(sub_a)    # "i am a python string!"
     print(sub_b)    # "i am a python string!"
     print(sub_c)    # "i am a python string!"
    
     print(arg_a)    # "with an arg!"
     print(arg_b)    # "with an arg!"
     print(arg_c)    # "with an arg!"
    
  2. 此外,Python中何时会出现字符串格式?例如,如果我的日志(log)记录级别设置为高,我是否仍会因为执行以下%个操作而受到攻击?如果是这样,有没有办法避免这种情况?

     log.debug("some debug info: %s" % some_info)
    

推荐答案

回答你的第一个问题..format只是在很多方面看起来更老练.%的一个恼人之处还在于它可以接受变量或元组.你会认为以下方法总是有效的:

"hi there %s" % name

然而,如果name恰好是(1, 2, 3),它将抛出TypeError.为了保证它总是打印出来,你需要

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

这太难看了..format没有这些问题.同样在你给出的第二个例子中,.format个例子看起来要干净得多.

你为什么不用呢?

  • 不知道(我在读这篇文章之前)
  • 必须与Python 2.5兼容

要回答第二个问题,字符串格式化与任何其他操作同时发生——在计算字符串格式化表达式时.Python不是一种懒惰的语言,它在调用函数之前对表达式求值,所以在你的log.debug示例中,表达式"some debug info: %s"%some_info将首先求值为,例如"some debug info: roflcopters are active",然后该字符串将被传递到log.debug().

Python相关问答推荐

使用Python OpenCV的文本检测分割

在Python中使用一行try

自定义新元未更新参数

使用Beautiful Soup获取第二个srcset属性

如何终止带有队列的Python进程?+ 队列大小的错误?

opencv Python稳定的图标识别

配置Sweetviz以分析对象类型列,而无需转换

使用miniconda创建环境的问题

如何在虚拟Python环境中运行Python程序?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

avxspan与pandas period_range

递归访问嵌套字典中的元素值

创建可序列化数据模型的最佳方法

如何在表中添加重复的列?

让函数调用方程

python panda ExcelWriter切换动态公式到数组公式

下三角形掩码与seaborn clustermap bug

剪切间隔以添加特定日期

导入错误:无法导入名称';操作';

Pandas:填充行并删除重复项,但保留不同的值