自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
语法介绍
在python中,可以使用%运算符进行灵活多样的格式化处理,通用的语法格式为:
(格式模板) + % +(值组)
格式化处理时,Python使用一个字符串(格式标记模板)作为格式模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值(值组)传递给格式模板,每个值对应一个格式符。
值组:既要格式化的字符串或者元祖,如果有两个及以上的值则需要用小括号括起来,中间用短号隔开。
格式模板:是一组或多组以%标记的字符串,通过格式标记模板可以灵活对值组进行格式化。格式模板的语法格式如下:
%[(name)][flags][width].[precision]typecode
格式模板中的格式标记符即可以简单、快速对数据进行格式化处理,也可以进行复杂的自动化处理和计算。其中只有typecode参数为必选项,其他选项都是可选项。所以typecode参数是最常用的格式化处理操作,每项操作都要用到,所以放到第一个进行介绍:
1)typecode,必选参数,表示获取对应类型的值并格式化到指定位置。格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型。主要的格式符有:
l s,获取传入对象的str方法的返回值,并将其格式化到指定位置。
l r,获取传入对象的repr方法的返回值,并将其格式化到指定位置。
l c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置。
l o,将整数转换成八进制表示,并将其格式化到指定位置。
l x,将整数转换成十六进制表示,并将其格式化到指定位置。
l d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置。
l e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)。
l E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)。
l f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)。
l g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)。
l G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)。
l %,当字符串中存在格式化标志时,需要用 %%表示一个百分号。
这些操作符最常用的是s、f、d,下面结合实例作以介绍:
print('%+s' % 20.53) # 格式化为字符串
print('%d' % 3.1415926) # 格式化为的整数
print('%f' % 20.53) # 格式化为浮点数,默认保留6位
print('%.2f' % 3.1415926) # 格式化为2位的浮点数
print('%3f' % 20.53) # 格式化为3位的浮点数
print('%e' % 3.1415926) # 格式化为科学记数法
输出结果为:
20.53
3
20.530000
3.14
20.530 000
3.141593e+00
2) (name),可选参数,较少使用。通常用在较复杂的字典格式化处理当中。在字典中选择指定的key,输出字典中指定的key对应的值,字典中没有顺序,只有键值对对应即可。如输出字典中手机的品名、销售数量和价格。
phone = '%(品名)s,%(数量)d,%(单价).2f' % {'单价': 3690, '数量': 2, '品名': 'mate20'}
print(phone )
输出结果为:
mate20,2,3690.00
使用字典格式化时,如果使用(name)作为字典中的键值,不用和字典中的元素进行一一对应。在使用(name)进行格式化时,可以灵活加入字符串常量,字符常量起到标记和说明作用,只相当于一个字符串的作用。如。
phone = '%(品名)s 销售数量为 %(数量)d 个,%(品名)s销售单价为%(单价).2f 元' % {'单价': 3690, '数量': 2, '品名': 'mate20'}
print(phone )
mate20 销售数量为 2 个,mate20销售单价为3690.00 元
采用(name)这种格式化可以灵活、方便地进行一些自动化工作。如自动出题、批量处理或验证数据。下面是题库自动出题系统中出题(带答案)的示例:
math = '用7、2、4组成一个最大的三位数是( %(答案1)s);用0、4、5组成一个最小的三位数是( %(答案2)s)。它们的差是(%(答案3)s)。' % {'答案1': 742, '答案2': 405, '答案3': '337'}
print(math)
输出结果为:
题目一:用7、2、4组成一个最大的三位数是( 742);用0、4、5组成一个最小的三位数是( 405)。它们的差是(337)。
3)flags,可选参数,默认为右对齐。可供选择的值有:+,-,' '或0。+ 表示右对齐。- 表示左对齐。' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填充。通常与width结合使用,演示示例放到3)Width中进行介绍。
l + 右对齐;正数前加正号,负数前加负号;
l - 左对齐;正数前无符号,负数前加负号;
l 空格 右对齐;正数前加空格,负数前加负号;
l 0 右对齐;正数前无符号,负数前加负号;用0填充空白处
4)Width,可选参数,指设置占位的宽度。通常和flags参数配合使用,示例如下:
print('%+6s' % '明日') # 字符串右对齐,左侧添加空格占位
print('%+6d' % -3.14) # 格式化为整数,右对齐,左侧添加空格占位
print('%-6s' % '明日') # 字符串左对齐,右侧添加空格占位
print('%-6d' % -3.14) # 格式化为整数,左对齐,右侧添加空格占位
print('% 6s' % '明日') # 字符串右对齐,左侧添加空格占位
print('%06d' % 3.14) # 格式化为整数,右对齐,左侧添加0占位
输出结果为:
明日
-3
明日
-3
明日
000003
5) .precision,可选参数,设置浮点数或字符串的精度。对于浮点数来说,用于设置浮点数的精度,即小数点后保留的位数。对于字符串来说,就是截取字符串的位数。
print('%.2s' % '明日科技') # 取字符串的前两位
print('%.2f' % 3.1415926) # 格式化为小数点保存为2位的浮点数
print('%.6f' % 3) # 格式化为小数点保存为6位的浮点数
print('%.f' % 3.14) # 默认小数点后保留的位数为0
print('%f' % 3.14) # 不写小数点,精度默认为6位小数
输出结果为:
明日
3.14
3.000000
3
3.140000
应用举例
1)对单个字符串进行格式化:
print('%d' % 20.53) # 格式化为整数
print('%6s' % '明日科技') # 格式化为6位居右显示的字符串,不足部分用空格填充
print('%f' % 20.53) # 格式化为浮点数,默认带6位小数
print('%o' % 20) # 格式化为八进制数
输出结果为:
20
明日科技
20.530000
24
注意:模板为字符串形式,所以一定要用单引号或双引号,格式化的内容如果是数字,可以不加引号,如果是字符串,一定要加引号。模板中的%是占位符,按其后面的控制字符格式化字符串。单个模板与字符串对应关系如图1、图2所示。
图1 模板与格式化数据
图2 模板与格式化数据
2)对多个字符串或者元祖进行格式化。如果为多个字符串,需要用括号括起来。并且格式化的字符串和格式模板要一一对应。
print('%d,%f' % (20.53,20.53)) # 格式化20.53为整数和浮点数
print('%d,%f,%.2f,%.4f' % (20.53,20.53,20.53,20.53)) # 模板和字符串要对应
# 分别格式化3.1415926为宽度为4,空位用0填充和保留两位小数的浮点
print('%04d,%0.2f' % (3.1415926,3.1415926))
s1 = "横坐标:%s,纵坐标:%s" % (123, 239) # 分别输出横坐标和纵坐标
print(s1)
输出结果为:
20,20.530000
20,20.530000,20.53,20.5300
0003,3.14
横坐标:123,纵坐标:239
注意:在模板中,按%后面的控制字符格式化字符串,在%前面可以添加标示字符串,输出时原文输出标示字符串,标示字符串可以对格式化字符串起到标示或说明作用。模板和值组中的元素要一一对应,否则会报错。多个模板与字符串对应关系如图3所示。
图3 格式模板与值组关系
快用锦囊
锦囊1 整数的格式化输出
整数包含十进制整数、八进制整数、十六进制整数等,对于八进制数和十六进制数,转换时需要使用0o(零欧)或0x(零x)前缀,告诉程序你现在格式化的数的进制(o -oct 八进制; d- dec,十进制;x -hex,十六进制)。在进制转换时,使用%o、%x、%d进行八进制整数、十六进制、十进制整数转换。常用转换示例如下:
print('%o' % 24) # 格式化十进制数为八进制数
print('%x' % 24) # 格式化十进制数为十六进制数
print('%o' % 0x3e) # 格式化十六进制数为八进制数
print('%x' % 0o122) # 格式化八进制数为十六进制数
print('%d' % 0x3e) # 格式化十六进制数为十进制数
print('%d' % 0o122) # 格式化八进制数为十进制数
print('%d' % 3.1415926) # 格式化浮点数为整数
print('%d' % (7/3)) # 格式化计算结果为整数
a=100/3+5
print('%d' % a) # 格式化变量为整数
输出结果为:
30
18
76
52
62
82
3
2
38
001
锦囊2 浮点数的格式化输出
在数据格式化时,对浮点数进行格式化是最常用的操作,通常使用“f ”操作符结合精度进行格式化操作。“%f”默认保留小数点后面六位有效数字;“%.3f”保留3位小数位。常用浮点数格式化操作如下:
print('%f' % 3.14) # 默认保留6位小数
print('%.f' % 3.14) # 默认保留0位小数
print('%.1f' % 3.14) # 保留1位小数
print('%.2f' % 3.1415926) # 保留2位小数
print('%+03.2f' % 3.1415926) # 右对齐宽度为3保留2位小数
print('%+6.1f' % -3.1415926) # 宽度为6,右对齐,保留1位小数,不足用空格填充
print('%-6.1f' % -3.1415926) # 宽度为6,左对齐,保留1位小数,不足用空格填充
print('% 6.1f' % -3.1415926) # 宽度为6,左对齐,保留1位小数,不足用空格填充
print('%06.1f' % -3.1415926) # 宽度为6,右对齐,保留1位小数,不足用0填充
输出结果为:
3.140000
3
3.1
3.14
+3.14
-3.1
-3.1
-3.1
-003.1
锦囊3 科学计数法的格式化输出
使用格式符“e”、“E”、“g”和“G”可以将数字格式华为科学记数法。使用科学计数法 %g ,在保证六位有效数字的前提下,使用小数方式,否则使用科学计数法。常用操作如下:
print('%e' % 31415.92653589) # 科学计数法表示,默认保留6位小数(不包含整数部分)
print('%.3e' % 31415.92653589) # 科学计数法表示,保留3位小数(不包含整数部分)
print('%g' % 31415.92653589) # 默认保留6位有效数字(包含整数部分)
print('%.6e' % 31415.92653589) # 科学计数法表示,默认保留6位小数(不包含整数部分)
print('%.6g' % 31415.92653589) # 保留6位有效数字(包含整数部分)
print('%.2g' % 31415.92653589) # 默认保留2位有效数字(包含整数部分),所以才用科学计数法
输出结果为:
3.141593e+04
3.142e+04
31415.9
3.141593e+04
31415.9
3.1e+04
锦囊4 字符串的格式化输出
字符串格式化也是程序中经常要做的工作,通常使用操作符“s ”对字符串进行格式化操作。如%s直接将数据格式化为字符串;%5s,右对齐,字符宽度为5位(如字符实际宽度超过设置的宽度,则按实际字符串输出); %-5s,左对齐,字符宽度为5位;%.4s,截取字符串的前4位字符串输出。常用的字符串操作如下:
print('%s' % 'mingisoft') # 字符串输出
print('%5s' % 'mingisoft') # 字符串长度超过5,宽度5不起作用
print('%20s' % 'mingisoft') # 默认右对齐,宽度为20位,不够默认用空格补位
print('%-20s' % 'mingisoft') # 默认左对齐,宽度为20位,不够默认用空格补位
print('%.4s' % 'mingisoft') # 截取字符串前4位
print('%8.4s' % 'mingisoft') # 截取字符串前4位,右对齐,设置宽度为8
print('%-8.4s' % 'mingisoft') # 截取字符串前4位,左对齐,设置宽度为8
print('www.%s.com' % 'mingisoft') # 灵活加入字符串常量,连接格式化字符串
print('%s.%s/%s' % ('mingisoft','com','book')) # 组合格式化字符
print('1%.1s 2%.1s 3%.2s' % ('吕布','赵云','典韦')) # 灵活加入字符串的格式化
输出结果为:
mingisoft
mingisoft
mingisoft
mingisoft
ming
ming
ming
www.mingisoft.com
mingisoft.com/book
1吕 2赵 3典韦
锦囊5 字典的格式化输出
如果使用字典存储数据,该如何对字典的数据进行格式化处理呢?使用字典时,只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符,这种形式只用在要输出的内容为字典时,这时对应关系不必是一一对应的关系,只需格式符中的name与字典中的键值对应即可。简单的词典操作如下:
print("%(pid)s,%(type)s,%(resource)s" % {'pid':1375,'type':'cpu','resource':2048})
print("%(002)s" % {'001':'沃尔玛','002':'中国石油化工集团公司','003':'荷兰皇家壳牌石油公司'})
world500 = {'沃尔玛':514405000,'中国石油化工集团公司':414649900,'荷兰皇家壳牌石油公司':39655600}
print('%(中国石油化工集团公司).2f' % world500)
stud={'Jeff':'1001','Jack':'1002','Joy':'1003','May':'1004'}
print('Jeff的学号:%(Jeff)s,May的学号:%(May)s' % stud)
book = {'name':'零基础学Python','price':79.8,'author':'明日科技'}
temp = '教材:%(name)s,价格:%(price).2f,作者:%(author)s'
print(temp % book)
输出结果为:
1375,cpu,2048
中国石油化工集团公司
414649900.00
Jeff的学号:1001,May的学号:1004
教材:零基础学Python,价格:79.80,作者:明日科技
注意:dict只支持字符串形式的key,对于int类型,可以直接取取字典的值
如果在遍历字典时对字典的数据进行格式化操作,该如何操作呢?使用for循环遍历字典,然后根据需要读取字典中的内容进行格式化即可。但要注意,遍历时是遍历整个字典还是遍历键,如果是遍历字典,按元祖读取每一项值即可;如果是遍历键,通过键读取对应的值。常见的代码操作如下:
phonebook = {'李铁':'135889012','王明':'187222341','胡旭':'1866789011','柳湖':'1778902121'}
for item in phonebook.items(): # 遍历整个字典
print( '%-8s %.6s ****'% (item[0],item[1])) # 对电话后4位用*号代替
for item in phonebook: # 遍历键
print( '%-8s,%.6s ****'% (item, phonebook[item]))
template='%(title)s \n %(homepage)s'
data = {'homepage':'www.mingrisoft.com', 'title':'Welcome to my home page!'}
print(template % data)
结果输出为:
李铁 135889 ****
王明 187222 ****
胡旭 186678 ****
柳湖 177890 ****
李铁 ,135889 ****
王明 ,187222 ****
胡旭 ,186678 ****
柳湖 ,177890 ****
Welcome to my home page!
www.mingrisoft.com
锦囊6 自动化处理数据
随着大数据时代的到来,我们需要处理的数据越来越多,是否可以同%格式符进行一些自动化处理工作呢?当然是可以的,大道至简,下面针对一些简单的数据,实现数据的自动化处理,代码如下:
print ("Name:%8s Age:%8d Height:%8.2f"%("Jeff",37,1.75))
print ("Name:%-8s Age:%-8d Height:%-8.2f"%("Jeff",37,1.75))
print ("Name:%8s Age:%08d Height:%08.2f"%("Jeff",37,1.75))
stud=(("Jeff",37,1.75),("Jack",22,1.85),("Joy",32,1.69),("may",27,1.68))
print ("Name:%8s Age:%08d Height:%08.2f"%(stud[0][0],stud[0][1],stud[0][2]))
print ('%s %s %s %s' % ("Jeff",37,1.75, ['Facebook', 'CFO']))
print ('%(name)s:%(score)02.1f'%{'score':9.0, 'name':'Jeff'})
结果输出如下:
Name: Jeff Age: 37 Height: 1.75
Name:Jeff Age:37 Height:1.75
Name: Jeff Age:00000037 Height:00001.75
Name: Jeff Age:00000037 Height:00001.75
Jeff 37 1.75 ['Facebook', 'CFO']
Jeff:9.0
使用循环语句可以批量格式化数据,从而实现数据的简单自动化处理工作。如下是对学生姓名、年龄和身高的批量输出,代码如下:
syst=[["Jeff",37,1.7523],["Jack",22,1.8534],["Joy",32,1.6908],["may",27,1.6834]]
for item in syst:
print ("Name:%-8s Age:%-8d Height:%-8.2f"%(item[0],item[1],item[2]))
输出结果为:
Name:Jeff Age:37 Height:1.75
Name:Jack Age:22 Height:1.85
Name:Joy Age:32 Height:1.69
Name:may Age:27 Height:1.68