python编程实践:格式化字符串输出的四种方式详解

Python字符串格式化输出,在python编程中,是一个非常重要的知识点,掌握了它,你就可以输出各种格式要求的文本内容,并生成相关要求的文件。下面介绍Python格式化字符串的四种方式,并给出了比较详尽的参数说明和举例,希望能够帮助到大家,以下是详细的内容:

一、%号

这是最早的字符格式化方法。字符串格式化使用与 C语言 中 sprintf 函数一样的语法。如果您没有使用过C语言,也没有关系,看看下面的表格参数的描述和例子也就明白了。

基本语法是:字符串 % ()

python字符串格式化符号:

符 号

描述

%c

格式化字符及其ASCII码

%s

格式化字符串

%d

格式化整数

%u

格式化无符号整型

%o

格式化无符号八进制数

%x

格式化无符号十六进制数

%X

格式化无符号十六进制数(大写)

%f

格式化浮点数字,可指定小数点后的精度

%e

用科学计数法格式化浮点数

%E

作用同%e,用科学计数法格式化浮点数

%g

%f和%e的简写

%G

%f 和 %E 的简写

%p

用十六进制数格式化变量的地址

格式化操作符辅助指令:

符号

功能

*

定义宽度或者小数点精度

-

用做左对齐

+

在正数前面显示加号( + )

在正数前面显示空格

#

在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')

0

显示的数字前面填充'0'而不是默认的空格

%

'%%'输出一个单一的'%'

(var)

映射变量(字典参数)

m.n.

m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

注:默认是右对齐。

1、按照顺序格式化字符串

当需格式化的字符串或者数字过多时,位置搞混估计有很大的可能。举例如下:

a = '张三'

b = '李四'

c = 3.1415926

print('%s和%s是兄弟!π=%5.2f' % (a, b , c)) # 张三和李四是兄弟!π= 3.14

print("%s和%s是兄弟!π=%5.2f" % ("张三", '李四', 3.14151926)) # 张三和李四是兄弟!π= 3.14

2、通过字典方式格式化字符串

通过字典方式格式化,打破了位置带来的限制与困扰。

如:%4d格式化数据,输出整数位4位,右对齐数字不足用空格代替。

print("我叫%(name)s,年龄%(age)4d岁" % {"name": '张三', "age": 20}) # 我叫张三, 年龄 20岁

kwargs = {"name": "张三", "age": 18}

print("我叫%(name)s, 年龄%(age)d岁" % kwargs) # 我叫张三, 年龄18岁

二、str.format 函数

format函数,它增强了字符串格式化的功能。str.format的格式化字符串的方式比%在性能和灵活性上要好很多。好处是format 函数可以接受不限个数的参数,而且位置可以不按顺序。

基本语法是通过 {} 和 : 来代替前面的 % 。

1、使用位置参数格式化

按照位置一一对应,这一点和%一样。

print("{}和{}是好朋友!".format('张三', '李四')) # 张三和李四是好朋友!

2、使用数字索引格式化

使用索引取对应位置的值,这是位置可以任意,按照需要排列。

print('{0}{0}{1}{0}'.format('张三', '李四')) # 张三张三李四张三

3、使用关键字参数格式化

通过关键字的方式格式化,打破了位置带来的限制与困扰。这一点也和%类似。

print("我叫{name}, 年龄{age}岁。".format(age=18, name="张三"))

4、使用字典格式化

通过字典方式的方式格式化,也能达到关键字参数的效果。

kwargs = {'name': '张三', "age": 18}

print("我叫{name}, 年龄{age}岁。".format(**kwargs)) # 使用**进行解包操作

注意:**kwargs,使用**进行解包操作,这点非常重要。新手容易不写**,而程序报错。

5、字符格式化

先取到值(使用数字索引),然后在冒号后面设定填充格式:[填充字符][对齐方式][宽度]

^, <, > 分别是居中、左对齐、右对齐。后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

需要注意的是,每个汉字算一个字符。这一点和C语言不一样的,C语言中,一个汉字计算为2个字符。举例如下:

#*<20: 意思是: 左对齐,总共20个字符,不足部分用*号填充

print("我叫{0:*<20},年龄 {1:*<10}岁!".format("张三", 18)) # 我叫张三******************,年龄 18********岁!

# *>10: 右对齐,总共10个字符,不足部分用*填充

print("我叫{0:*<10}".format("张三")) # 我叫张三********

# *^18: 居中,总共18个字符,不足部分用*填充

print("我叫{0:*^18}".format("张三")) # 我叫********张三********

# ^20: 居中,总共20个字符,不足部分用空白填充

print("我叫{0:^20}".format("张三")) # 我叫 张三

6、数字格式化

数字

格式

输出

描述

3.1415926

{:.2f}

3.14

保留小数点后两位

3.1415926

{:+.2f}

+3.14

带符号保留小数点后两位

-1

{:-.2f}

-1.00

带符号保留小数点后两位

2.71828

{:.0f}

3

不带小数

5

{:0>2d}

05

数字补零 (填充左边, 宽度为2)

5

{:x<4d}

5xxx

数字补x (填充右边, 宽度为4)

10

{:x<4d}

10xx

数字补x (填充右边, 宽度为4)

1000000

{:,}

1,000,000

以逗号分隔的数字格式

0.25

{:.2%}

25.00%

百分比格式

1000000000

{:.2e}

1.00e+09

指数记法

13

{:>10d}

13

右对齐 (默认, 宽度为10)

13

{:<10d}

13

左对齐 (宽度为10)

13

{:^10d}

13

中间对齐 (宽度为10)

11

'{:b}'.format(11)

'{:d}'.format(11)

'{:o}'.format(11)

'{:x}'.format(11)

'{:#x}'.format(11)

'{:#X}'.format(11)

1011

11

13

B

0xb

0XB

进制

^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格

b、d、o、x 分别是二进制、十进制、八进制、十六进制。

举例如下:

# 123456.12精确到小数点后2位,四舍五入

print("{temp:.2f}".format(temp=123456.1234567))

# 123456.1234567890精确到小数点后10位,四舍五入

print("{temp:.10f}".format(temp=123456.1234567))

# ---3.14--- 取2位小数后,居中,共10位,其余用-填充

print("{:-^10.2f}".format(3.1415926))

# 1111011 转成二进制

print("{0:b}".format(123))

# 1,234,567 千分位格式化

print("{0:,}".format(1234567))

需要注意的是:如果字符串里出现大括号 {} ,可以通过重复的方法,使用大括号 {} 来转义大括号。

举例如下:

#张三对应的位置是{0}

print ("{}对应的位置是{{0}}".format("张三"))

三、f-Strings

f-Strings称之为格式化字符串常量(formatted string literals)以F或者f开头,后面跟字符串,在字符串中,以大括号 {} 标明被替换的字段,将变量或表达式计算后的值替换进去。f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。

f-string是以f或F开头的字符串,这样表达非常简练。

1、{}中可以是变量名

name = '张三'

print(f"我叫{name}") # 我叫张三

2 、{}中可以是表达式

在{}中放置任意合法的表达式,会在运行时计算。

print(f"{3 * 3 / 2}") # 4.5

a = 1

b = 2

print(f"a + b = {a + b}") # a + b = 3

3、{}中可以调用函数

name = 'zhangsan'

print(F"我叫{name.upper()}") # 我叫ZHANGSAN

name = '张三'

print(F"我叫{len(name)}") # 我叫2

注意汉字'张三'的长度是2,而不是4。

def test(n):

return n

print(F"{test(10)}") # 10 执行时打印函数的返回值

需要注意的是:

(1)在{}中使用‘或者”,保证{}内外使用的不一样即可。

(2)在{}中需要同时使用’和“,则需要外部字符串使用文档字符串符号三个单引号或者三个双引号。

(3){}中不允许出现\即使作为函数参数;必须使用的话,可以采用将包含\的内容赋值到一个变量里,然后再使用这个变量进行格式化输出。

(4)f.string 格式可用于多行字符串,其方法和长字符串的表达是一样的。

四、string模块的template

这是string模块提供的一个模版类,默认使用$ 或者 ${}(建议用这个)来占位,而不是用%,具体用法如下:

首先是引用库:

from string import Template

s = 'hi!${name}'

res = Template(s).substitute(name='张三') # substitute替代的意思

print(res) # hi!张三

需要注意的是:

(1)当需要输出一个$符号时,可以使用$$,也就是重复一下。

(2)当格式化字符串中有变量未给出值时,使用safe_substitute函数,此函数将占位符当成字符串输出,如果使用substitute会报错

五、小结

(1)str.format() 比%格式化高级了一些。但是它还是有自己的缺陷。当需要传入的字符串过多时,仍然会显得非常冗长。str.format更简洁,性能上比%也更胜一筹。

(2)f-strings,不仅str.format更简洁,性能上也更胜一筹。

(3)f-string在功能方面不逊于传统的%语句和str.format()函数,同时性能又优于两者,且使用起来也更加简洁明了,因此推荐使用f-string进行字符串格式化。

(4)注意使用环境是python 3.6及以上。

(5)string模块提供的模版类,是另外一种字符串格式化输出的方法。

你可能感兴趣的:(python在气象业务中的应用,python,开发语言)