ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

格式化字符串输出的4种方式及比较

2022-09-10 13:00:12  阅读:198  来源: 互联网

标签:输出 格式化 name format my age print 字符串 zhangsan


格式化字符串输出的4种方式
'''
Python格式化字符串的4中方式
一:%号
二:str.format(args)
三:f-Strings
四:标准库模板
五:总结四种方式的应用场景'''

# 一:%号占位符
'''这是一种引入最早的一种,也是比较容易理解的一种方式.使用方式为:

1\格式化字符串中变化的部分使用占位符
2\变量以元组形式提供
3\变量与格式化字符串之间以%连接'''
# 1、格式的字符串(即%s)与被格式化的字符串(即传入的值)必须按照位置一一对应
# ps:当需格式化的字符串过多时,位置极容易搞混
# 例如
a = 'zhangsan'
b = 'lisi'
print('%s eated %s' % (a, b)) # zhangsan eated lisi
print("%s asked %s to do something" % ("zhangsan", 'lisi')) # zhangsan asked lisi to do something
# 2、可以通过字典方式格式化,打破了位置带来的限制与困扰
print("我的名字是%(name)s,我的年龄是%(age)s" % {"name": 'zhangsan', "age": "list"}) # 我的名字是zhangsan,我的年龄是list

kwargs = {"name": "zhangsan", "age": 18}
print("my name is %(name)s, my age is %(age)s" % kwargs) # my name is zhangsan, my age is 18

# 二:str.format 内建函数
# 该format函数是在python2.6以后引入的,是字符吕类型的内置方法。因为str.format的方式
# 比%在性能和灵活性上更好一些。

# 2.1 使用位置参数
# 按照位置一一对应
print("{} and {} is good friedng".format('zhangsan', 'lisi')) # zhangsan and lisi is good friedng

# 2.2 使用索引
# 使用索引取对应位置的值
print('{0}{0}{1}{0}'.format('哈哈', '隔')) # 哈哈哈哈隔哈哈

# 2.3 使用关键字参数or字典
# 可以通过关键字or字典方式的方式格式化,打破了位置带来的限制与困扰
print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='egon'))

kwargs = {'name': 'egon', 'age': 18}
print("my name is {name}, my age is {age}".format(age=18, name="zhangsan"))

kwargs = {'name': 'zhangsan', "age": 18}
print("my name is {name}, my age is {age}".format(**kwargs)) # 使用**进行解包操作

# 2.4 填充与格式化
# 先取到值,然后在冒号后面设定填充格式:[填充字符][对齐方式][宽度]
# *<20: 意思是: 左对齐,总共20个字符,不足部分用*号填充
print("my name is {0:*<20},my age is {1:*<10}".format("zhangsan",
18)) # my name is zhangsan************,my age is 18********

# *>10: 右对齐,总共10个字符,不足部分用*填充
print("my name is {0:*<10}".format("zhangsan")) # my name is zhangsan**

# *^10: 居中,总共18个字符,不足部分用*填充
print("my name is {0:*^18}".format("zhangsan")) # my name is *****zhangsan*****

# ^20: 居中,总共20个字符,不足部分用空白填充
print("my name is {0:^20}".format("zhangsan")) # my name is zhangsan

# 2.5 精度与进制
print("{salary:.2f}".format(salary=123456.1234567)) # 123456.12精确到小数点后3位,四舍五入
print("{salary:.10f}".format(salary=123456.1234567)) # 123456.1234567890精确到小数点后3位,四舍五入
print("{:-^10.2f}".format(3.1415926)) # ---3.14--- 取2位小数后,居中,共10位,其余用-填充
print("{0:b}".format(123)) # 1111011 转成二进制
print("{0:o}".format(123)) # 173 转成八进制
print("{0:x}".format(123)) # 7b 转成十六进制
print("{0:,}".format(1234567)) # 1,234,567 千分位格式化

# 三:f-Strings
'''由python3.6版本引入的一个特性,称之为字面量格式化字符串
以F或者f开头,后面跟字符串,字符串中的表达式用大括号{}包起来,它会将变量或表达式计算后的值替换进去'''
# ​ f-string是以f或F开头的字符串, 核心在于字符串中符号{}的使用

# 3.1 {}中可以是变量名
name = 'zhangsan'
print(f"my name is {name}") # my name is zhangsan

# 3.2 {}中可以是表达式
# 可以在{}中放置任意合法的表达式,会在运行时计算
print(f"{3 * 3 / 2}") # 4.5

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

# 比如 函数的调用
name = 'zhangsan'
print(F"my name is {name.upper()}") # my name is ZHANGSAN


def foo(n):
print("zhangsan is beautifull")
return n


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

# 在{}中使用‘或者” 保证{}内外使用的不一样即可,如下
print(F'test {"str"}') # teststr
print(F"test {'str'}") # teststr

# 在{}中需要同时使用’和“,则需要外部字符串使用文档字符串符号’‘’或者”“”
name = 'zhangsan'
print(F'''it's name is "{name}" ''') # it's name is "zhangsan" 注意各个’‘’是不一样的
print(F"{'{}'}") # 输出{} 注意两种引号不一样

# {}中不允许出现\即使作为函数参数;必须使用的话,可以将包含\的内容放到一个变量里,如下
a = 'zhangsan'
b = f'my name is {a:-^10}'
print(b) # my name is -zhangsan-

# a = f'print the {"\t"}'
# print(a) # 语法错误

a = '\n'
print(F"print the {a}") # print the \n没有显示 但打印正常

# f.str 格式可用于多行字符串,有两种方式:使用连接符\ 和使用doc签字串。如下
name = 'zhangsan '
age = 18

res = f'my name is {name},' \
F"my age is {age}," \
F"and i'm happy"

print(res) # my name is zhangsan ,my age is 18,and i'm happy

res = f'''my name is {name} ,my age is {age},and i'm happy,
my name is {name} ,my age is {age},and i'm happy
my name is {name} ,my age is {age},and i'm happy
my name is {name} ,my age is {age},and i'm happy'''

print(res) # 输出4行文本

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

s = 'hi ${name}'
res = Template(s).substitute(name='zhangsan') # substitute替代品的意思
print(res) # hi zhangsan

# 当需要输出一个$符号时,可以使用$$
s1 = f'{name}‘s salary is $$1000'
res = Template(s1).substitute(name='zhangsan')
print(res)

# Template还有一个safe_substitute函数,
# 当格式化字符串中有变量未给出值时,此函数将占位符当成字符串输出,
# 而substitute会报错

name = 'zhangsan'

# s2 = f'{name} and {name2}‘s salary is $$1000'
# res = Template(s2).substitute()
# print(res) # 报错NameError: name 'name2' is not defined


s3 = 'hi ${apple}, ${peach}'
res = Template(s3).safe_substitute(apple='apple')
print(res) # hi apple, ${peach}

# 五:总结四种方式的应用场景

# 性能对比
from timeit import timeit


def test_s():
name = 'zhangsan'
age = 18
return "%s:%s" % (name, age)


def test_format():
name = 'zhangsan'
age = 18
return '{}:{}'.format(name, age)


def test_f():
name = 'zhangsan'
age = 18
return f'{name}:{age}'


def test_t():
return Template('{name}:{age}').substitute(name='zhangsan', age=18)

res1 = timeit(test_s, number = 100000)
res2 = timeit(test_format, number = 100000)
res3 = timeit(test_f, number = 100000)
res4 = timeit(test_t, number = 100000)
print(res1) # 0.027567900004214607
print(res2) # 0.03230700000131037
print(res3) # 0.020800700003746897
print(res4) # 0.0893696999992244

# 看效率表现,还是 最新的f.str最快

# 我的结论
# 1、3.6以后,用f.str
# 2、%占位符和.format要能读能用
# 3、%就不要再用了
# 4、template现在看是考虑安全性

标签:输出,格式化,name,format,my,age,print,字符串,zhangsan
来源: https://www.cnblogs.com/leeyong49/p/16676321.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有