游乐园有旋转木马,是否玩过?这些旋转木马之上,每天都会迎来不同的面孔的小朋友去游玩。
每一个木马的背椅上,随着不同的小朋友坐上去,展现出来的画面都将有所改变。
虽然木马是不变的,但小朋友都是不一样的。所以对于旋转木马来说,固定的木马,流水的小朋友。
格式化非常类似于旋转木马。可以用对号入座的方式来关联它们。
字符串上的固定字符,就是旋转木马。字符串上可变的部分,就是小朋友。而木马的骑背是用来更换不同的小朋友的。
字符串中的格式化符号就是承载一个一个不同的字符的。
看这个字符串,其中有几处元素是不确定的,它们用xx来替代。下面是日期和天的两个变量。这个字符串的xx的位置,可以随时跟随data和day,两个变量值的变化而变化。这个就是字符串的格式化。
几个可能用到格式化的场景:
这个3个场景为什么会用字符串的格式化呢?无论是发邮件还是发短信,或者是app上的推送。程序一发,肯定是一次性发送给很多人吧。
但是发给每个人的信息,它们的模版基本是一样的。只有针对于每个用户自己的信息是不同的。
如果每个用户发送出去的信息格式都完全不一样。那程序根本不知道该写些什么,只能靠人工一个一个得发。那样是非常消耗人力和时间的。
所以这个时候,使用统一的模版信息。将它进行格式化操作。每个用户仅仅改变需要格式化变更的位置,发送给用户。
是不是可以大大节省人力和时间呢?所以说:
%在字符串里就是代表格式化的意思了。虽然都是%,但是使用场景不同,意义也就不同。
格式化的一个完整分解图
这个字符串的完整分解过程:从左向右。共分为3个部分。第一个部分是格式化字符串的部分,也是字符串的主体。
在主体里,需要格式化的元素用%s来表示。这里有2个%s,说明有2个需要被格式化的变量。
看完左边的字符串主体后,往右看到一个%,这个%,左关联了字符串主体,右关联了对应格式符数量的变量元组。
这个%,也是格式化的重要组成部分。没有它,是无法格式化的。
可以这样认为,这个%是左边字符串中格式符与右边变量的桥梁。
再向右看,已经知道了这里是格式符对应的变量。这些变量与格式符顺序相同。一一对应,数量也要保持一致。否则就会报错了。
在这里,因为有2个字符串格式符,所以右边就会对应2个变量。
如果字符串主体中只有一个格式符,右边就只对应一个变量。
如果只有一个变量的情况下,就不需要通过元组来包裹。
只有在2个或2个以上变量的时候,才需要用元组来包裹。这就是一个完整字符串格式化的用法。
在这个例子中,发现右边变量里第一个变量是字符串,第二个变量是整型。
但左边对应的格式符都是%s,那是因为在python的格式化符号中,%s是一个通用的格式符。
任何类型,都可以通过%s来格式化匹配。
例1:
# coding:utf-8
info = 'my name is %s,my age is %s' % ('xiaobian',10)
print(info)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/.venv/bin/python /Users/llq/PycharmProjects/pythonlearn/pythonlearn1/format.py
my name is xiaobian,my age is 10
进程已结束,退出代码为 0
例2:
# coding:utf-8
info = 'my name is %s,my age is %s'
name_01 = '小编'
age_01 = 10
name_02 = 'dewei'
age_02 = 33
print(info % (name_01,age_01))
print(info % (name_02,age_02))
message = '您好,今天是%s,您的手机号码:%s 已经欠费了,请尽快充值'
print(message % ('星期一',123456789))
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/.venv/bin/python /Users/llq/PycharmProjects/pythonlearn/pythonlearn1/format.py
my name is 小编,my age is 10
my name is dewei,my age is 33
您好,今天是星期一,您的手机号码:123456789 已经欠费了,请尽快充值
进程已结束,退出代码为 0
格式符与变量应该一一对应,数量相同,如果数量不同,会怎么样呢?
例3:
# coding:utf-8
info = 'my name is %s,my age is %s'
name_01 = '小编'
age_01 = 10
name_02 = 'dewei'
age_02 = 33
print(info % (name_01,age_01))
print(info % (name_02,age_02))
message = '您好,今天是%s,您的手机号码:%s 已经欠费了,请尽快充值'
print(message % ('星期一',123456789))
print(message % 1234567)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/.venv/bin/python /Users/llq/PycharmProjects/pythonlearn/pythonlearn1/format.py
my name is 小编,my age is 10
my name is dewei,my age is 33
您好,今天是星期一,您的手机号码:123456789 已经欠费了,请尽快充值
Traceback (most recent call last):
File "/Users/llq/PycharmProjects/pythonlearn/pythonlearn1/format.py", line 14, in <module>
print(message % 1234567)
TypeError: not enough arguments for format string
进程已结束,退出代码为 1
再用字符串格式化,格式其它的数据类型,比如列表和字典:
例4:
# coding:utf-8
info = 'my name is %s,my age is %s'
name_01 = '小编'
age_01 = 10
name_02 = 'dewei'
age_02 = 33
print(info % (name_01,age_01))
print(info % (name_02,age_02))
message = '您好,今天是%s,您的手机号码:%s 已经欠费了,请尽快充值'
print(message % ('星期一',123456789))
print(message % (1234567,'星期2'))
print(message)
books =['python','django','flask']
info_2 = 'my name is %s,my age is %s,my book is %s'
print(info_2 % (name_01,age_01,books))
dict_01 = {'a':'a','b':'b'}
print('dict is %s' % dict_01)
运行结果:
/Users/llq/PycharmProjects/pythonlearn/pythonlearn/.venv/bin/python /Users/llq/PycharmProjects/pythonlearn/pythonlearn1/format.py
my name is 小编,my age is 10
my name is dewei,my age is 33
您好,今天是星期一,您的手机号码:123456789 已经欠费了,请尽快充值
您好,今天是1234567,您的手机号码:星期2 已经欠费了,请尽快充值
您好,今天是%s,您的手机号码:%s 已经欠费了,请尽快充值
my name is 小编,my age is 10,my book is ['python', 'django', 'flask']
dict is {'a': 'a', 'b': 'b'}
进程已结束,退出代码为 0