python格式化字符串的三种方法(%,format,f-string)_在java中可以使用string.format函数,python中可以使用%或format方法来格式-程序员宅基地

技术标签: python  格式化字符串  

DAY 7. 格式化字符串

到目前为止,我所知道的,python格式化字符串有三种方法,第一是早期就有的%,其次是2.5之后的format(),还有就是3.6添加的f字符串调试

7.1 %格式化字符串

%格式化字符串是python最早的,也是能兼容所有版本的一种字符串格式化方法,在一些python早期的库中,建议使用%格式化方式,他会把字符串中的格式化符按顺序后面参数替换,格式是

"xxxxxx %s xxxxxx" % (value1, value2)
  • 其中 %s就是格式化符,意思是把后面的值格式化为字符类型,类似的格式化符还有%d,%f等,具体参考文章Python字符串格式化
  • 后面的value1,value2就是要格式化的值,不论是字符还是数值,都会被格式化为格式化符对应的类型
  • 当然可以不用以元组的形式传值,你可以直接写这样:"xxxxx %s" % value,不过不建议这样写,一是应为这样只能传递一个参数,二是如果value是元组或列表等类型,这样会触发TypeErrer
  • 如果只传一个参数,并且很确定参数类型不会触发异常,可以使用上面的写法,否则,我建议你提供一个单元素元组,就像"xxxx %s " % (value,)
value1 = (7, 8)
value2 = [9, 0]
print("DAY %s 格式化字符串 %s " % (value1,value2))
value3 = 1
s = "xxxix %s" % value3  # 不推荐
print(s)
s1 = "xxxx %s " % value1
print(s1)  # TypeError: not all arguments converted during string formatting

7.2 format()

%虽然强大,但用起来难免有些麻烦,代码也不是特别美观,因此,在python 2.5 之后,提供了更加优雅的str.format()方法。

    def format(self, *args, **kwargs): # known special case of str.format
        """
        S.format(*args, **kwargs) -> str

        Return a formatted version of S, using substitutions from args and kwargs.
        The substitutions are identified by braces ('{' and '}').
        """
        pass
  • format()的常用用法
# 使用名称占位符
s2 = "xxxx {age} xxxx {name}".format(age=18, name="hangman")
print(s2)  # xxxx 18 xxxx hangman

# 使用序号占位符,为空默认从左到右01234.。。
s3 = "xxxx {1} xxx{0}".format(value1,value2)
print(s3)  # xxxx [9, 0] xxx(7, 8)

# 也可以混合使用
s4 = "xxxx {} XXX {name} xxx {}".format(value2,value1,name="s4")
print(s4)  # xxxx [9, 0] XXX s4 xxx (7, 8)

7.3 f-string

f-string是2015年python 3.6 根据PEP 498新添加的一种字符串格式化方法,f-string实际上是在运行时计算的表达式,而不是常量值。在Python源代码中,f-string是一个文字字符串,前缀为’f’,其中包含大括号内的表达式。表达式会将大括号中的内容替换为其值。例如

import datetime
name = "zings"
age = 17
date = datetime.date(2019,7,18)
print(f'my name is {
      name}, this year is {
      date:%Y},Next year, I\'m {
      age+1}')  # my name is zings, this year is 2019,Next year, I'm 18
7.3.2 格式规范迷你语言

“格式规范”用于格式字符串中包含的替换字段中,以定义各个值的显示方式

标准格式说明符的一般形式是:

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
(1) 对齐 align
align(对齐方式) 作用
< 左对齐(字符串默认对齐方式)
> 右对齐(数值默认对齐方式)
= 填充时强制在正负号与数字之间进行填充,只支持对数字的填充
^ 居中
  • 除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下,对齐选项没有意义。
  • 如果指定了align值,则可以在其前面加上可以是任何字符的填充字符,如果省略则默认为空格。 无法使用文字大括号(“{”或“}”)作为格式化字符串文字中的填充字符或使用str.format()方法。 但是,可以插入带有嵌套替换字段的大括号。
print(f'{
      name:^18}')  # |      zings     |
(2) sign

sign只对数字起作用

sign 作用
+ 强制对数字使用正负号
- 仅对负数使用前导负号(默认)
空格 对正数使用一个’ ‘作前导,负数仍以’-'为前导
print(f'{
      money:+}')  # +19999999877
(3) #选项

'#'选项使“替代形式”用于转换。 对于不同类型,替代形式的定义不同。 此选项仅对integer,float,complex和Decimal类型有效。 对于整数,当使用二进制,八进制或十六进制输出时,此选项将前缀“0b”,“0o”或“0x”添加到输出值。 对于浮点数,复数和十进制,替换形式会导致转换结果始终包含小数点字符,即使后面没有数字也是如此。 通常,只有在跟随数字的情况下,这些转换的结果中才会出现小数点字符。 此外,对于“g”和“G”转换,不会从结果中删除尾随零。

(4) ,选项

','被用来对数字整数部分进行千分位分隔

描述符 作用
, 使用,作为千位分隔符
_ 使用_作为千位分隔符
  • , 仅适用于浮点数、复数与十进制整数:对于浮点数和复数,, 只分隔小数点前的数位。
  • _ 适用于浮点数、复数与二、八、十、十六进制整数:对于浮点数和复数,_ 只分隔小数点前的数位;对于二、八、十六进制整数,固定从低位到高位每隔四位插入一个 _(十进制整数是每隔三位插入一个 _)。
print(f'{
      money:,}')  # 19,999,999,877
(5) width

width是定义最小字段宽度的十进制整数。 如果未指定,则字段宽度将由内容确定。

当然,format还有很多彪悍的特性,还可以看这位大佬的文章:Python字符串格式化

(6) .precision

.precision对于数字对象,用来指定数字的小数位数,如果有小数;对于非数字对象,用来指定最终返回的格式化字符的最大长度,即格式化完成后,以这个precision参数对结果进行截取

(7) type

[外链图片转存失败(img-AtydwvFj-1563463465332)(…/…/image/python_总结_01.png)]

**注意:**格式规范迷你语言对format一样适用(本来就是format的)

7.4 总结

python最先的格式化字符串方法是%,但他的致命缺点是支持的类型有限,只支持int,str,double,其他所有类型只能转换为这几个类型,还有如果传递的是元组,那么必须还要传入一个单值元组,为此,添加了str.format()以解决%-formatting中的一些问题,特别是,它使用普通函数调用语法(并因此支持多个参数),并且可以通过__format __()方法在被转换为字符串的对象上进行扩展。但str.format()又存在代码冗余的问题,例如

v = 6*8
print("the value is {}".format(v))

而使用f-string只需要

print(f'the value is{
      6*8}')

F字符串提供了一种简洁易读的方式,可以在字符串中包含Python表达式的值。包括lambda表达式(要放在括号里)

参考文章

PEP 498

python doc

Python字符串格式化

Python格式化字符串f-string概览

GitHub python 面试题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zjbyough/article/details/96466658

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法