Python中format()函数的作用是对字符串执行格式化操作。
format()函数的语法形式如下所示:
str.format(*args, **kwargs)
str是待格式化的字符串,一般这个字符串中应包含一对英文半角的花括号{ },用于指定位置索引、参数名或其它格式符,花括号处的内容将被替换成位置索引或参数名及其它格式符指定的值,这些值来自format()函数的参数指定的值序列。
args参数用于给定值序列,用于替换str中{}里位置索引处的值。
kwargs参数以关键字参数(即keyargs = value)的形式给出格式字符串中的值。
下面先给出一个简单的例子来看看该函数的基本使用方法:
weburl = "http://www.VeVb.com"
webname = "武林网VEVB"
webinfo = "{0}的网址是:{1}".format(webname, weburl)
print(webinfo)
输出结果如下:
武林网VEVB的网址是:http://www.VeVb.com
在Python3.8.2中的代码及输出情况如下图所示:
在 这个例子中,{0}和{1}分别用来指定参数列表中的webname和weburl来替换{0}和{1}处的内容,这从输出结果也可以看出来。
下面从字符串和参数等角度分别给出若干例子来探讨format()函数在实际中使用的情形。
print("今天的值日生是{0}".format("王涛"))
print("今天的一对新人是{0}和{1}".format("韩梅梅","李明"))
print("我们学习的编程语言有:{}、{}".format("Python","Java"))
print("请{1},{2},{0}来办公室一趟".format("A","B","C"))
输出结果如下:
今天的值日生是王涛
今天的一对新人是韩梅梅和李明
我们学习的编程语言有:Python、Java
请B,C,A来办公室一趟
从上面的例子可以看出,在指定索引的替换串中,替换位置的值将按照索引使用参数对应的值来完成替换。
如果在替换字符串中未指定索引值,其按照{}出现的顺序来编索引,即按照0,1,...,n来编索引。
替换字符串中的索引没有先后顺序之分,如上面最后一个例子就演示了这一点。
参数的个数可以多于替换字符串中需要的值,但在未提供索引时,参数给定的值个数不能少于需替换的位置数量。
下面这个例子可以得出正确结果:
print("我正在学习{1}".format("Java", "Python", "C#"))
输出结果为:
我正在学习Python
但下面这种情况不允许
print("我学习的语言有{},{}和{}".format("Java", "Python"))
由于没给定索引,默认其编号分别为0,1 和 2,而参数在两个的情况下最大编号为1,这就超出了索引范围而引发IndexError错误:
Traceback (most recent call last):
File "D:/01Lesson/PY/pythonformat.py", line 12, in <module>
print("我学习的语言有{},{}和{}".format("Java", "Python"))
IndexError: Replacement index 2 out of range for positional args tuple
当然下面这种指定索引的情况是可以的
print("我一直在学习{0},{0} ......".format("Python"))
输出结果:
我一直在学习Python,Python ......
在format()函数中也可以使用关键词参数来格式化字符串。即在format()函数的参数列表中,使用给参数赋值的方法来定义值列表,并在格式化字符串中使用参数名来传递值。其形式为:
"{var1}{var2}...".format(var1 = value1, var2 = value2, ...)
下面给出一个具体的例子:
formatedstr = "{webname}的网址是:{weburl}".format(webname = '武林网VEVB',
weburl = 'http://www.VeVb.com')
print(formatedstr)
输出结果如下:
武林网VEVB的网址是:http://www.VeVb.com
在Python中,可以把字典数据作为参数传递给format()函数,用于格式化字符串,其形式如下:
"{key}".format(**dict)
将被格式化的字符串{}中的key即是字典中的key,format函数将会把dict中key对应的值替代{}位置中的内容。
dict即使字典变量或字典数据。
为了使用key对应的值来替代key对应的值,函数在执行时需要解包字典中的数据,Python中的"**"操作符就是用来解包字典中的数据的。
换句话说:**就是把字典型数据解析成关键字型参数,如字典{"arg1":"v1", "arg2":"v2"}作为参数传递给format函数的话,其将该字典解析为:arg1="v1",arg2="v2"这样的关键字参数。
下面举一个例子来说明其具体用法:
dict1 = {"lang1":"Python", "lang2":"Java", "lang3":"R"}
popularlang = "我喜欢{lang1}和{lang3}".format(**dict1)
print(popularlang)
输出结果如下:
我喜欢Python和R
上面的函数调用相当于:
popularlang = "我喜欢{lang1}和{lang3}".format(lang1 = "Python", lang2 = "Java", lang3 = "R")
元组或列表型数据也可以作为format()函数的参数,其语法格式如下:
"{index1}{index2}...".format(*tupleorlist)
上面语法中index1和index2表示引用元组或列表的位置索引,即使用元组或列表中该位置处的值来替换{}处的内容。
tupleorlist即是传递的元组或列表数据或变量。
“*”操作符用于解包元组或列表中的数据,也就是说*在这里把元组或列表这样的序列数据解析成位置参数。
下面举例子说明:
#元组作为参数
t1 = ("Python", "Java", "SPSS")
print("我正在学习{0}和{2}".format(*t1))
print("小明正在学习{2}和{0}".format(*t1))
#列表作为参数
list1 = ["HTML", "CSS", "JavaScript"]
print("{0}非常简单".format(*list1))
print("{2},{1}和{0}都很简单。".format(*list1))
输出结果如下:
我正在学习Python和SPSS
小明正在学习SPSS和Python
HTML非常简单
JavaScript,CSS和HTML都很简单。
上面使用*调用的元组参数相当于:
print("我正在学习{0}和{2}".format("Python", "Java", "SPSS"))
对于元组或列表这种序列值也可以使用下面的格式实现字符串的格式化:
#元组
t1 = ("Python", "Java", "SPSS")
print("我在学习{0[0]}和{0[2]}".format(t1))
#列表
list1 = ["Python", "Java", "SPSS"]
list2 = ["HTML", "CSS", "JavaScript"]
print("我在学习{0[1]}和{1[2]}".format(list1, list2))
#混用
list1 = ["Python", "Java", "SPSS"]
print("我学过{0[2]},{1}和{2}".format(list1,"C++", "sqlite"))
输出结果如下:
我在学习Python和SPSS
我在学习Java和JavaScript
我学过SPSS,C++和sqlite
上面格式化字符串中使用了两个索引,因为format()函数允许传递多个参数,当参数为多个且为序列值时,第一个索引用于指定参数所在的位置索引,第2个用于指定序列值中的元素位置,上面用三个例子来演示了使用方法来揭示其中的奥秘,读者可以自己分析一下。
对象类型也可以作为format函数的参数,使用成员运算符“.”来访问对象中的数据。
###对象作为参数
#首先定义一个类
class Student:
sid = ''
sname = ''
age = 20
def __init__(self, sid):
self.sid = sid
#定义一个类的对象
stu1 = Student("001")
stu1.sname = "王涛"
stu1.age = 22
print("{0.sname}的学号是{0.sid},年龄是{0.age}".format(stu1))
print("{stu.sname}的学号是{stu.sid},年龄是{stu.age}".format(stu = stu1))
上面的程序输出结果如下:
王涛的学号是001,年龄是22
王涛的学号是001,年龄是22
上面程序中给出了两种引用对象中属性的方法:第一种使用0表示参数的位置索引,第二种使用了关键字参数的形式。
被格式化字符串{}中的内容为空时,则按照其出现的顺序默认使用0,1,2...来表明其引用的参数索引,并用参数对应的值来替换;
被格式化字符串{}中为数值索引时,将使用参数列表中对应位置的值来替换;
被格式化字符串{}中为关键字名称时,则使用参数列表中对应的关键字名称的值来替换;
函数参数为元组、列表等这样的值时,在函数调用时,其参数要使用str.format(*t)这种格式;
函数参数为词典这样的值时,在函数调用时,其参数要使用str.format(**dict)这种格式。
这篇文章仅介绍了被格式化字符串和参数之间的对应问题,没有涉及到字符串的其他格式,如输出数字的格式,字符串对齐等格式,本站将在今后的文章中作进一步的介绍。
新闻热点
疑难解答