第六章 python杂货铺之字符串格式化和带颜色输出

6.1 字符串格式化

6.1.1 含义

​ 所谓字符串格式化,即是指对字符串进行格式化操作,也即将字符串进行某种处理,如控制字符串中内容的长度、对齐方式、小数的保留位数或者实现对字符串中的某些内容采用一个占位符标识,此占位符接受用户的输入,然后通过获取用户的输入实现同一行字符串的定义可以实现输出不同的内容,等等;

6.1.2 分类
方法 特点
%方法 比较老的一种方法,简单、使用方便
字符串format()方法 比较新的一种方法,两种方法共存
6.1.3 %方式
6.1.3.1 原理:

​ %格式字符串的原理是,在需要被格式化的字符串内,采用一个占位符去标识该占位符处的内容是一个动态的内容,该动态的内容接受来自于用户传递的参数;然后在需要被格式化的字符串后加上空格,然后采用固定的语法设置需要传递的参数,传入参数的方法可以是位置传参和字典的方式传参,传递的参数可以是具体的常量、变量、类、对象等等;

​ 占位符相当于一个变量,对字符串进行格式化后,一旦对该字符串进行深度处理,则该占位符会被替换成传递的参数之后再进行处理;

6.1.3.2 语法

​ '[任意子字符串] 占位符 [任意子字符串] 占位符.....' 向占位符传参的固定语法

6.1.3.3 占位符语法

​ %[(name)]typecode

语法说明:

​ %: %为一个标识符,标识采用%方法进行字符串格式化操作,其必须存在;

​ [(name)]: 不是语法符号,其仅仅用于标识(name)是可以被省略的选项;

(name)参数存在性 含义
不存在 表示占位符采用位置传参的方式接受用户传递的实参;若字符串中有多个占位符,则第一个占位符接受传递的第一个参数,第二个占位符接受传递的第二个参数,.....以此类推;
存在 则name作为字典的key进行处理,用户传递参数只能采用字典的方式传递参数;根据定义的占位符中的key,将传递参数中该key对应的value来替换该占位符;

​ typecode: 标识此占位符接受的参数的数据类型,数据类型有很多种,最常用的仅仅只有两种:

typecode 功能
s 接受传入的任意数据类型来替换占位符,占位符接受到的输入会进行str(用户传递的参数)处理
d 标识仅仅接受用户传递十进制整数来替换占位符号
%% 不采用%进行格式化控制: 字符串中的%原样处理;
采用%进行格式化控制: 字符串中的%识别为标记符号,此时若要原生的%,则必须要采用%%,而采用其他方式均不能实现,即使采用\进行转义也没有任何效果;
其它 不需要理解和记忆,没有啥用
6.1.3.4 传参的固定语法:

​ %(arg1,arg2,....args) 或%{'key':xxx,'key2':xxx,.......**kwargs}

总结说明:

​ case1: %是标识符号,用于标识此后的内容是向%格式化输出中的占位符传递参数

​ case2:若占位符为%typecode:采用 %(arg1,....*args) 进行位置传参;多个参数采用逗号分隔,若只有一个参数()可以省略;
​ 则第一个占位符接受()内传递的第一个参数,第二个占位符接受()内传递的第二个参数,.....以此类推;

​ case3:若占位符为%(name)typecode:采用%{'key':xxx,'key2':xxx,.......}进行传参;
​ %(name)typecode的占位符仅仅接受字典内,key为‘name’的value来替换该占位符;

​ case4: 参数可以是常量、变量(变量、class、实例等等)

6.1.3.5 案例:
name = 'test'
age = '18'
v= 'hello world , my name is %s age %s ' %(name,age)
print(v)
	输出:
		hello world, my name is test age 18
 v='hello world , my name is %(name)s age %(age)s' %{'name':'test','age':18}
 print(v)

	输出:
		hello world , my name is test age 18
扩展案例:
msg='''
	1 %s
	2 %s
	3 %s
'''
data= msg %('test1','test2','test3')
6.1.4 字符串format()方式

说明:

​ format()方法为调用class str的一个函数属性format()采用此函数属性实现对字符串进行格式化

特别注意:

​ 此处的format()不同于format()内置函数,_format_()内置属性;

​ _format_()为系统默认的类的一个内置方法;

​ 内置函数format(object)实际上是调用object._format_()

说明:

​ class str即存在一个format()方法,也存在一个_format_()方法;要引起注意;

6.1.4.1 底层实现原理:

​ format()方法也是在要格式化处理的字符串内采用特定的占位符,标识字符串内该处的内容接受来自用于传递的参数;与%方法相同的是,传递参数的方式可以是位置传参和关键字传参,传递的参数可以是常量也可以是变量;与%方法不同的是,format()方法,是采用该字符串调用str class中的format()这个函数,通过向这个format()类的方法传递参数的方式,去向占位符传递参数,同时format方法采用的占位符也不同于%方法的占位符;

6.1.4.2 语法:

​ '[任意子字符串] 占位符 [任意子字符串] 占位符.....'.format(*args,**kwargs)

6.1.4.3 占位符语法

语法:

​ {[key][:typecode]}

语法说明:

​ key:可选参数,其有三种类型;

key类型 功能
省略 format()采用位置传参,第一个{}接受format中的第一个实参,第二个{}接受format中的第二个实参,....依次类推;
>=0的数字 format()采用位置传参,{0}接受format中的第一个实参,{1}接受format中的第二个实参,....依次类推;
此种情况下,占位符可以调用传入的实参的一个或多个,不需要全部调用,也不需要按顺序调用,可以任意的调用
字符串 format()采用关键字传参,{name}占位符仅仅接受format()中关键字传递的参数中关键字为name所传递的参数;

​ typecode: 可选参数,默认值为s,标识接受任意类型的用户参数,完全同%方法;

key扩展说明:

​ {number} 或 {key}这两种占位符中,number和key就相当于一个变量;若该变量指向的对象为含有多级元素的对象,如format中传递的参数为str list tuple dict set等数据类型,我们可以通过对number key变量进行索引切片、或字典关键字的方式去对应参数的特定的元素;

6.1.4.4 案例:
v='{} {} {}'.format('helo','world','aba')
print(v)
v='{1} {1} {2}'.format('helo','world','aba')
print(v)
v='{0[1]} {0[2]} {1}'.format([11,22,33],'world','aba')
print(v)
	 输出:
 		helo world aba
		world world aba
		22 33 world

6.2 带颜色输出

说明:

​ python中的带颜色输出,同linux的带颜色输出的语法是相同的;

方法:

​ 在输出的字符串中采用固定的带色输出语法,控制输出的前景、背景、字体;

6.2.1固定语法

​ \033[a;b;cm 要输出的字符串 \033[0m

语法说明:

​ \033[: 固定语法,开启带色输出,标识其后的字符串要进行字体和颜色控制;

​ \033[0m: 固定语法,关闭带色输出,标识其后的内容不会进行颜色和字体控制;

​ a: 控制字体格式;

​ b: 固定语法:3n,3标识前景色,n控制具体的颜色,控制前景色,即字体的颜色;

​ c: 固定语法,4n,4标识前景色,n控制具体的颜色,控制背景色;

​ abc:三者都可以省略,存在多个,则采用分号分隔;

字体控制:

字体控制符 字体控制
0 关闭颜色输出,0m
1 字体高亮,即加粗显示
3 字体倾斜
4 下划线
5 字体闪烁
7 字体反白显示
8 字体不可见,即字体采用背景色输出

颜色控制:

颜色字符 颜色
0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 紫色
6 天蓝
7 白色
3.2 案列
print('\033[31m hello wold \033[0m')
print('\033[1;31;42m hello world \033[0m')
posted @ 2019-12-24 14:50  大兵0815  阅读(198)  评论(0)    收藏  举报