字符串格式化
字符串格式化是拼接字符串的一种手段。在字符串的常用方法中的join()方法便是一种拼接手段。
>>> ' '.join(['xu','love','you'])
'xu love you'
但是,join和拼接字符串难以控制格式。所以我们需要进一步的工具。
print style 字符串格式化
通过占位符来达到字符替换的作用
占位符:%,加一个格式控制符
当待格式化的字符串中存在占位符的时候:s = '人的偏执 %s'
接着通过在字符串后面追加一个百分号,再追加一个元组,在元组中放入你需要的字符串即可
>>> s = '人的偏执 %s'
>>> s % ('也挺好')
'人的偏执 也挺好'
传入参数顺序的替换占位符,返回替换后的字符串,这是原地不修改,有返回值的:
>>> 'i am %d ,and i feel %s' % (21,'happy')
'i am 21 ,and i feel happy'
#若传入的数量不对等,类型不对等,就会报TypeError
#当占位符是%s的时候,其实隐式调用了str()
#当占位符是%r时,其实时隐式调用了repr()
#关于这些repr和str的区别,会在后面进行总结。暂且搁置。
如果想原样输出%s,在前面要多一个百分号。
>>> '%%%s' % (18,)
'%18'
(当我们在拼接sql时,一定要使用这种方法,可以帮助避免恶意攻击)
format方法
format方法使用大括号作为占位符
>>> s = '人的偏执 {}'
>>> s.format(' 也挺好')
'人的偏执 也挺好'
#可以加入多个{}
>>> s = 'i am {} ,and i feel {}'
>>> s.format(21,'happy')
'i am 21 ,and i feel happy'
#可以在占位符里加数字,指定format参数的位置
>>> s = 'i am {1} ,and i feel {0}'
>>> s.format(21,'happy')
'i am happy ,and i feel 21'
#参数可以通过指定位置方式多次使用
>>> s = 'i am {1} ,and i feel {1}'
>>> s.format(21,'happy')
'i am happy ,and i feel happy'
#可以在占位符里加标识符,来使用关键字参数
>>> s = 'i am {age} ,and i feel {emtion}'
>>> s.format(age = 21,emtion = 'happy')
'i am 21 ,and i feel happy'
#且同时支持使用位置和关键字参数
>>> s = 'i am {0} ,and i feel {emtion}'
>>> s.format(21,emtion = 'happy')
'i am 21 ,and i feel happy'
位置参数必须要在前面,关键字参数在后面
占位符和参数不匹配或者参数超出均会抛出异常
- {}按照顺序,使用位置参数
- {数字 i}会把位置参数当成一个列表args,args[i],当i不是args的索引时,会抛出异常
- {关键字 k}会把关键字参数当成一个字典kwagrs,使用kwagrs[k],当k不是kwagrs的key时,会抛出KeyError
- 若需要打印{},则在外面加一层{}即可。
>>> '{{}}'.format(18)
'{}'
>>> '{{{}}}'.format(18)
'{18}'
指令集
部分数字占位符在进行数据清理和过滤的时候十分有用。
浮点和小数可用类型:
f前缀
在f前缀之前还学过r、u这两个前缀。
- u前缀:
u"字符串。"
作用:后面字符串以Unicode 格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。 - r前缀:
r"\n\n\n\n” # 表示一个普通生字符串 \n\n\n\n,而不表示换行。
作用:去掉反斜杠的转义机制 - b前缀:
response = b'<h1>Hello World!</h1>'
# b’ ’ 表示这是一个 bytes 对象
作用:b" "前缀表示:后面字符串是bytes 类型。
而f前缀,和format非常相近:
>>> who = '傅菁'
>>> do = '爱'
>>> whom = '五选一的奶茶'
>>> f'{who}{do}{whom}'
'傅菁爱五选一的奶茶'
在代码块的上文中已经提及到这些变量后,便可以直接调用f前缀加上这些关键来组合。
除了语法上有些许不同外,format有的,f-string都有,也更加推荐使用该方法。
import decimal
from datetime import datetime
>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is 'Fred'."
>>> f"He said his name is {repr(name)}." # repr() is equivalent to !r
"He said his name is 'Fred'."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result:{value:{width}.{precision}}" # nested fields嵌套字段
'result: 12.35'
>>> today = datetime(year=2019,month=7,day=15)
>>> f"{today:%B %d, %Y}" # using date format specifier
'July 15, 2019'
>>> number = 1024
>>> f"{number:#0x}" # using integer format specifier
'0x400'
小结
字符串格式化的三种方式。f-string学好了会方便很多。指令集也可以多看看。加油!!!希望自己可以这个星期学到第三章的内容!