字符串格式选项:优点和缺点

2024-01-03

这是在 Python 中格式化字符串的两种非常流行的方法。一种是使用dict:

>>> 'I will be %(years)i on %(month)s %(day)i' % {'years': 21, 'month': 'January', 'day': 23}
'I will be 21 on January 23'

另一个使用简单的tuple:

>>> 'I will be %i on %s %i' % (21, 'January', 23)
'I will be 21 on January 23'

第一个的可读性更高,但第二个的写入速度更快。我实际上模糊地使用它们。

每一种的优点和缺点是什么?关于性能、可读性、代码优化(其中之一是否转换为另一个?)以及您认为有用的其他内容。


Why format()比更灵活%字符串操作

我认为你真的应该坚持format()的方法str,因为它是格式化字符串的首选方式,并且将来可能会取代字符串格式化操作。

此外,它还有一些非常好的功能,还可以将基于位置的格式与基于关键字的格式相结合:

>>> string = 'I will be {} years and {} months on {month} {day}'
>>> some_date = {'month': 'January', 'day': '1st'}
>>> diff = [3, 11] # years, months
>>> string.format(*diff, **some_date)
'I will be 3 years and 11 months on January 1st'

甚至以下内容也可以工作:

>>> string = 'On {month} {day} it will be {1} months, {0} years'
>>> string.format(*diff, **some_date)
'On January 1st it will be 11 months, 3 years'

还有另外一个理由支持format()。因为它是一个方法,所以可以作为回调传递,如下例所示:

>>> data = [(1, 2), ('a', 'b'), (5, 'ABC')]
>>> formatter = 'First is "{0[0]}", then comes "{0[1]}"'.format
>>> for item in map(formatter, data):
    print item


First is "1", then comes "2"
First is "a", then comes "b"
First is "5", then comes "ABC"

是不是比字符串格式化操作灵活很多呢?

查看更多示例文档页 http://docs.python.org/library/string.html#format-examples用于比较%运营和.format() method.

比较基于元组的%基于字典的字符串格式化

一般有三种调用方式%字符串操作 (yes, three, not two) 像那样:

base_string % values

它们的类型有所不同values(这是内容内容的结果base_string):

  • 它可以是一个tuple,然后按照它们在元组中出现的顺序一一替换,

    >>> 'Three first values are: %f, %f and %f' % (3.14, 2.71, 1)
    'Three first values are: 3.140000, 2.710000 and 1.000000'
    
  • 它可以是一个dict(字典),然后根据关键字进行替换,

    >>> 'My name is %(name)s, I am %(age)s years old' % {'name':'John','age':98}
    'My name is John, I am 98 years old'
    
  • 它可以是单个值,如果base_string包含应插入值的单个位置:

    >>> 'This is a string: %s' % 'abc'
    'This is a string: abc'
    

它们之间有明显的区别,并且这些方式不能组合(与format()方法能够结合一些特征,如上所述)。

但有一点就是仅特定于基于字典的字符串格式化操作并且在其余三种格式化操作类型中相当不可用。这是替换能力规范者以简单的方式使用实际变量名称:

>>> name = 'John'
>>> surname = 'Smith'
>>> age = 87
# some code goes here
>>> 'My name is %(surname)s, %(name)s %(surname)s. I am %(age)i.' % locals()
'My name is Smith, John Smith. I am 87.'

只是为了记录:当然,上面的内容可以很容易地替换为使用format()通过像这样解压字典:

>>> 'My name is {surname}, {name} {surname}. I am {age}.'.format(**locals())
'My name is Smith, John Smith. I am 87.'

还有其他人知道什么可能是特定于一种类型的字符串格式化操作的功能,而不是另一种类型的功能吗?听到这个可能会很有趣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串格式选项:优点和缺点 的相关文章

  • 在 Python 中处理单值元组的最佳实践是什么?

    我正在使用第三方库函数 它从文件中读取一组关键字 并且应该返回一个值的元组 只要有至少两个关键字 它就能正确执行此操作 但是 在只有一个关键字的情况下 它返回一个原始字符串 而不是大小为 1 的元组 这是特别有害的 因为当我尝试做类似的事情
  • Python的unpack中的逗号是什么意思?

    我们可以简单地使用 crc struct unpack gt i data 为什么人们这样写 crc struct unpack gt i data 逗号是什么意思 第一个变体返回一个单元素元组 In 13 crc struct unpac
  • 在 python + Flask + Gunicorn + nginx + Compute Engine 应用程序中从 Google Cloud Storage 读取文件失败

    在 python Flask Gunicorn nginx Compute Engine 应用程序中读取从 Google Cloud Storage 下载的文件失败 代码链接 https github com samuq CE test h
  • 如何更改条形图上的 y 轴限制?

    我有一个df 我从中索引了europe n我绘制了一个条形图 europe n r 5 c 45 looks like this df Country string df Population numeric 变量 plt bar df C
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • 将列表传递给 PyCrypto 中的 AES 密钥生成器

    我尝试使用 Pycrypto 生成 AES 密钥 但收到以下错误 类型错误 列表 不支持缓冲区接口 对于以下声明 aescipher AES new mykey AES MODE ECB mykey 属于类型list并包含 18854347
  • int 对象在尝试对数字的数字求和时不可迭代? [复制]

    这个问题在这里已经有答案了 我有这个代码 inp int input Enter a number for i in inp n n i print n 但它抛出一个错误 int object is not iterable 我想通过将每个
  • ValueError:在 R 中使用 keras 模型时在用户代码中

    我正在尝试使用 R 在 R 中运行一维 CNNkeras包裹 我正在使用以下代码 library MASS library keras Create some data data Boston data lt Boston create a
  • 如何使用泛型类型的构造函数

    如何使用 python 泛型类型的构造函数 T typing TypeVar T class MyClass typing Generic T def init self initialValue typing Iterable self
  • 在 Windows 上将 NumPy 与 BLAS 链接

    我正在尝试在 Windows 系统上安装 Theano 并且需要安装 BLAS 和 LAPACK 我的 System32 文件夹中有这些的 dll 文件 当我运行 numpy config来自 Anaconda 的 show 库的路径正确显
  • 按字段名称对命名元组列表进行排序的 Pythonic 方法

    我想对命名元组列表进行排序 而不必记住字段名的索引 我的解决方案看起来相当尴尬 希望有人能有一个更优雅的解决方案 from operator import itemgetter from collections import namedtu
  • PyPI 项目页面中的“Py 版本”是什么意思?这有关系吗?

    我注意到 大多数在 PyPI 上发布的项目在其项目页面中都包含 Py 版本 元数据 但它们的值各不相同 如果包不是通用包或不是纯 python 包 那么它们的值是不同的 这是可以理解的 以便表示它们的目标平台 例如鼻页 https pypi
  • 在 Ubuntu 上使用 Python 获取显示器分辨率

    对于 Ubuntu win32api 中是否有与 GetSystemMetrics 相当的代码 我需要获取显示器的宽度和高度 以像素为单位 我可以建议一些可以使用的方法 不过我还没有使用过 xlib 版本 1 xlib Python 程序的
  • Cython:为什么 size_t 比 int 快?

    更改某些 Cython 变量的类型int输入size t可以显着减少某些功能的时间 30 但我不明白为什么 例如 cimport numpy as cnp import numpy as np def sum int cnp int64 t
  • 将数据框列打包到 pandas 中列出

    我需要将 pandas DataFrame 列打包到包含列表的一列中 例子 For gt gt gt df a b c 0 81 88 1 1 42 7 23 2 8 37 63 3 18 22 20 制作列表栏 list col 0 81
  • 不重复的Python组合

    我有一个数字列表 我想从中进行组合 如果我有清单 t 2 2 2 2 4 c list itertools combinations t 4 结果是 2 2 2 2 2 2 2 4 2 2 2 4 2 2 2 4 2 2 2 4 但我想得到
  • 在 (i)python 脚本中从 jupyter 内核获取输出

    我想从单个 ipython 会话中打开多个内核 在这些内核上运行代码 然后收集结果 但我不知道如何收集结果 甚至不知道如何查看 stdout stderr 我怎样才能做这些事情呢 到目前为止我所得到的 我已经使用如下代码管理了前两个步骤 打
  • 安排 Asyncio 任务每 X 秒执行一次?

    我正在尝试创建一个 python 不和谐机器人 它将每隔 X 秒检查一次活跃会员 并根据会员的在线时间奖励积分 我正在使用 asyncio 来处理聊天命令 这一切都正常 我的问题是找到一种方法来安排每隔 X 秒异步检查一次活动成员 我已经阅
  • python pandas如何在多个条件下过滤字符串

    我有以下数据框 import pandas as pd data 5Star FiveStar five star fiv estar data pd DataFrame data columns columnName 当我尝试用一 种条件
  • Python pip 安装错误 [SSL: CERTIFICATE_VERIFY_FAILED]

    我已经尝试解决这个问题有一段时间了 由于某种原因 我陷入了 ssl 问题 并且不知道发生了什么 问题 我已经安装了 python2 7 和 easy install2 7 但是当尝试使用 easy install2 7 安装 pip 时 出

随机推荐

  • 如何从用户获取多行输入[重复]

    这个问题在这里已经有答案了 我想编写一个程序来获取多行输入并逐行使用它 为什么没有类似的功能raw input在 Python 3 中 input does not allow the user to put lines separated
  • Android 市场和 APK 文件名

    我将上传到 Android 市场的最终 apk 文件的名称重要吗 用户可以看到文件的名称吗 不 姓名 apk文件被忽略 用户将无法看到它 你可以命名 apk以您方便的任何方式 Android Market 只解析内部 apk文件并提取所需的
  • R随机森林不一致的预测

    我最近使用 R 中的 ranger 包构建了一个随机森林模型 但是 我注意到训练期间存储在 ranger 对象中的预测 可通过 model predictions 访问 与我在使用创建的模型的相同数据集 以下代码在 mtcars 数据集上重
  • 如何切换到旧版本的 ruby​​/rails 环境?

    我正在尝试与 Tekpub 在 Rails 上构建您自己的博客截屏视频保持一致 我仍然是一个 ruby 新手 问题是我安装了 Rails 3 而 Rob 使用旧版本 我的脑海中 版本 2 3 2 我知道如何获得该版本的 Railsgem i
  • 使用 PHP 格式化 JSON 数据

    我有以下代码
  • iPhone X 中的背景图像拉伸

    目前我们使用 1x 2x 和 3x 的图像资源 它将支持所有设备 但是 当我们在 iPhone X 上使用相同的图像资源时 3x 图像在 iPhone X 中看起来会被拉伸 因此 请让我知道如何支持具有相同图像资源的 iPhone X 设备
  • NSPredicate 用于过滤 NSString 类型的两个日期

    我有一些数据 如NSDictionary in an NSMutableArray 样本数据如下 将每一行视为NSDictionary整个表是一个NSMutableArray包含事件 我想在两个日期之间得出结果 所以我使用NSPredica
  • Firebase 分析事件没有显示价值

    我有一个游戏 我想在每次用户设置新的高分时发送事件 我检查当前分数是否 gt 之前的分数 如果是 我将新的高分发送到 firebase 代码 Bundle bundle new Bundle bundle putLong FirebaseA
  • 我使用 AntiXSS 但我仍然可以破解页面

    我不知道我这样做是否正确 我第一次构建一些东西来防止页面受到攻击 我将从最底层开始 我有财产 public string Description get set 用户可以通过tinyMCE设置其值 tinyMCE init mode tex
  • 从暂存器访问附加 SDK 模块

    我想使用暂存器测试我的附加代码的小片段 在这种情况下 我尝试像这样访问通知模块 const notify require sdk notifications notify My notification s options 正如预期的那样
  • NHibernate 与 IIS 7 的会话

    我有一个使用 NHibernate 的 ASP NET MVC 应用程序 并且该应用程序在通过 VS2008 虚拟 Web 服务器运行时运行良好 但是当我尝试通过本地 IIS 服务器运行该站点时 我不断收到此 NHibernate 错误 没
  • 提交 fetch() POST 请求后使用 fetch() GET 请求输出数据库数据,无需硬页面刷新

    我有一个使用 javascript 提交数据的表单fetch 使用 PHP 访问 MySQL 数据库的 API 在下面的代码中 当提交表单时 页面上会输出一条成功消息 并且由于fetch API 板模块本身最初是通过 添加到板 元素上的单击
  • 三角形不渲染[重复]

    这个问题在这里已经有答案了 我在渲染一个简单的三角形时遇到问题 下面的代码编译并运行 但没有任何三角形 只有黑色背景 GLuint VBO static void RenderSceneCB glClear sets the bitplan
  • Google Foobar:如何查找边缘情况并识别测试用例。蟒蛇[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Problem 完美燃油喷射 拉姆达指挥官请求你帮助改进自动系统 LAMBCHOP 末日号的量子反物质燃料喷射系统 设备 这是您近距离
  • “线程屏障”同步模式上的 C++ 正确原子内存排序

    我需要在预定义数量的工作线程 通过应用程序配置静态已知 和预定义数量的控制平面线程之间正确同步对某些共享资源的访问 控制平面线程接收来自外部的请求 并基于该请求可能修改共享资源 工作线程只是运行一个无限循环 其中共享资源是只读的 为了以线程
  • pytest-django 中的重置序列

    我已将我的问题发布到pytest django https github com pytest dev pytest django issues 但似乎至少有两周不活跃 我决定在这里问我的问题 在我的测试中我想使用重置序列 真 https
  • 是否有 Office 365 REST API 可以从组织中的所有邮箱获取邮件?

    我正在探索一个选项 看看是否可以使用 Office 365 Mail REST API 从组织中 即域内 的所有邮箱获取邮件 或者是否有任何其他方式可以轻松获取这些邮件 这些是我探索过的选项 1 将所有电子邮件密件抄送至特定帐户 然后从密件
  • For 循环的迭代次数比我在 Python 中预期的要少[重复]

    这个问题在这里已经有答案了 我希望下面的循环迭代六次 而不是使用 python3 迭代三次 我不明白这种行为 我知道当我删除元素时列表会发生变化 但我不知道这如何影响 for 循环条件 为什么循环迭代少于六次 a 1 2 3 4 5 6 f
  • 模拟对象可以设置返回两个所需的结果吗?

    模拟对象是否可以用于返回多个所需结果 如下所示 mockObject Setup o gt o foo It IsAny
  • 字符串格式选项:优点和缺点

    这是在 Python 中格式化字符串的两种非常流行的方法 一种是使用dict gt gt gt I will be years i on month s day i years 21 month January day 23 I will