0、Python之.format()方法

format():格式化输出,是Python2.6新增的格式化字符串的方法,把传统的%替换为{}来实现格式化输出(%:格式化操作符),相对于老版的%格式方法,有很多的优点。

优点:

1.format()不需要理会数据类型的问题;在%方法中%s只能替代字符串类型。

2.单个参数可以多次输出,参数顺序可以不相同。

3.填充方式十分灵活,对齐方式十分强大。

4.官方推荐使用的方式

 

format()后面的内容,填入大括号{}中(其中{}花括号表示replacement字段),format()可以接受2种参数:位置参数、变量(关键字)参数,均传递到replacement字段。

按位置参数

1.参数按照位置的顺序填充到字符串中,第一个参数是0,然后是1,2,3.......

>>> '{0} love {1}.{2}'.format('I','Fishc','com')  #前面的字符串调用format()方法
'I love Fishc.com'
>>> '{1} love {0}.{2}'.format('I','Fishc','com')   #注意位置的替换
'Fishc love I.com'
>>> 

2.不输入数字,直接按照顺序来填充

>>> '{} love {}.{}'.format('I','Fishc','com')
'I love Fishc.com'
>>> 

 

>>> #需要输出{},可以用{{}},即{}对自己转义
>>> '{{{0} love {1}}}'.format('I','you')
'{I love you}'
>>> 

 

>>> #一个位置参数可以使用2次
>>> '{{{1} love {0}.{1}}}'.format('fishc','I')
'{I love fishc.I}'
>>> 

 

按关键字参数

>>> #按照关键字参数,format()中要具体写明参数对应的值
>>> '{a} love {b}.{c}'.format('I','Fishc','com')
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    '{a} love {b}.{c}'.format('I','Fishc','com')
KeyError: 'a'
>>> '{a} love {b}.{c}'.format(a = 'I',b = 'Fishc',c = 'com')
'I love Fishc.com'
>>> 

综合位置参数、关键字参数(位置参数必须在关键字的前面,否则就是错误的)

>>> #综合 位置参数和关键字参数
>>> '{0} love {b}.{c}'.format('I',b = 'Fishc',c = 'com')
'I love Fishc.com'
>>> '{a} love {b}.{0}'.format(a = 'I',b = 'Fishc','com')
SyntaxError: positional argument follows keyword argument
>>> 

 

一、基本字符串操作

字符串都是不可变的。如下所示的项或者分片赋值都是不合法的: 

>>> website = 'http://www.baidu.com'
>>> website[-3:]='org'
Traceback (most recent call last):
File "<pyshell#125>", line 1, in <module>
website[-3:]='org'
TypeError: 'str' object does not support item assignment
>>>

二、字符串格式化

表:字符串格式化转换类型

 符号         说 明
 %c        格式化字符及其ASCII码
 %s        格式化字符串
 %d        格式化整数
 %o        格式化无符号八进制数
 %x        格式化无符号十六进制数
 %X        格式化无符号十六进制数(大写)
 %f         格式化定点数,可指定小数点后的精度
 %e        用科学计数法格式化定点数
 %g        根据值的大小决定使用%f或者%e
 %G       根据值的大小决定使用%F或者%E
 
 字符串的格式化使用的是:字符串格式化操作符%

 

转换说明符%s 、%d、%x等表示:需要插入转换值的位置。

转换方法:左操作数 % 右操作数

格式化操作符的右操作数可以是任意类型,右操作数是元组,元组的每一个元素都会被单独格式化

>>> '%s + %s =%s' % (4,5,4+5)
'4 + 5 =9'
>>>
>>> '%s love fishc' % 'I'

'I love fishc'
>>>
>>> format = 'Hello,%s.%s is beautiful'
>>> values = ('world','Flower')    #用元组的形式
>>> format % values
'Hello,world.Flower is beautiful'
>>>

 

基本的转换说明符

(1)%字符:标记转换说明符的开始。

(2)转换标志:-表示左对齐

        +表示在转换值之前加上正号

        ‘ ’空格表示在正数之前保留空格

        0表示在转换数若位数不够用0填充

(3)字段宽度:转换后的字符串指定出字段宽度

(4).(点)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。

 

(一)简单转换

>>> '%s + %s ==%s' % (4,5,4+5)
'4 + 5 ==9'
>>> '%s + %s =%s' % (4,5,4+5)
'4 + 5 =9'
>>> 'price is :$%d' % 42
'price is :$42'
>>> 'price is :%x' % 42
'price is :2a'
>>> from math import pi
>>> 'pi is:%f...' % pi
'pi is:3.141593...'
>>> 'pi is:%.5f' % pi
'pi is:3.14159'
>>> 'pi is:%i' % pi
'pi is:3'

(二)字段宽度跟精度

>>> from math import pi
>>> 'pi is:%10f' % pi
'pi is:  3.141593' #字段宽10,不足前位补空位
>>> '%10.2f' % pi
'      3.14'      #字段宽10,精度为2
>>> '%.2f' % pi
'3.14'
>>> '%.5s' % 'Google help'  #精度为5
'Googl'
>>>  

(三)符号、对齐、用0填充

用0填充

在字段宽度和精度值之前还可以放置一个“标志”,该标志可以是0,加号,减号或者空格,0表示数字将会用0进行填充。

>>> 'pi is:%010.2f' % pi
'pi is:0000003.14'
>>>  

注意:在上述例子中的010中,开头的0并不意味着字段宽度说明符为八进制数,只是普通的Python数值。

减号(-)用来左对齐数值

>>> '%10.2f' % pi
'      3.14'
>>> '%-10.2f' % pi
'3.14      '
>>> 

加号(+):不管是正数还是负数都标示出正负号

>>> print(('%+5d' % 3.14) + '\n' + ('%+5d' % -3.14))
   +3
   -3   #负号标示出来
>>> 

“ ”空格在正数前面加上空格(正负数的对齐时:很有用)

>>> print(('% 5d' % 3.14) + '\n' + ('%5d' % -3.14))
    3
   -3
>>> 

 

三、字符串中最常用的方法

1.find()

解释:可以在一个较长的字符串中查找子串,返回子串所在位置的最左端索引(第一次出现的子串),如果没有找到则返回-1.

>>> 'I love Fishc.com'.find('com')
13
>>> title = 'I love fishc.com'
>>> title.find('fishc')
7
>>> title.find('hello')#找不到返回-1
-1
>>> 

注意:如果返回值是0,不是布尔型的0,而是在索引位置0找到了子串。例如:

>>> namestr = '$$$ Get Rich Now!$$$'
>>> namestr.find('$$$')
0
>>> 

find()添加起始点跟结束点参数

>>> namestr
'$$$ Get Rich Now!$$$'
>>> namestr.find('!$$',1)#只提供起始点
16
>>> namestr.find('!$$')
16
>>> namestr.find('Rich',0,7) #索引位置起始点0,结束点位置7之间没有找到子串
-1
>>> 

2.join()

解释:用来连接序列中的元素,是字符串中很重要的方法,是split()方法的逆方法。

注意:需要被连接的序列元素都必须是字符串!!

>>> list1 = [1,3,4,6,7,9]
>>> seq = '+'
>>> seq.join(list1)
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    seq.join(list1)
TypeError: sequence item 0: expected str instance, int found
>>> list2 = ['2','5','6','9']
>>> seq = '+'
>>> seq.join(list2)
'2+5+6+9'
>>> 
>>> dirs = '','user','bin','env'
>>> '/'.join(dirs)
'/user/bin/env'
>>> print('C:'+'\\'.join(dirs))
C:\user\bin\env
>>> 

 

3.split()

解释:将字符串分割成序列,是join()的逆方法。

>>> 'This is a good idea!'.replace('is','ez')
'Thez ez a good idea!'
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']>>> 'I love Fishc.com'.split(' ')
['I', 'love', 'Fishc.com']
>>> 

 

4.lower()

解释:返回字符串的小写字母版。

>>> title = 'I love Fishc.com'
>>> title.lower()
'i love fishc.com'
>>> 

 

5.replace()

解释:返回某字符串的所有匹配项均被替换之后得到的字符串。

>>> 'This is a good idea!'.replace('is','ez')   #可以理解为查找并替换
'Thez ez a good idea!'
>>> 

6.strip()

解释:(1)不加参数是除去字符串两侧的空格(不含字符串中间的空格)

   (2)加参数,是除去两侧的需要去掉的字符

>>> '      I love Fishc.com     '.strip()#不加参数
'I love Fishc.com'
>>> 

 加参数,只会去除字符串两侧的字符,对字符串中间没有影响.

>>> '### I love ##Fishc.com ##  hello ####'.strip('##')#加参数
' I love ##Fishc.com ##  hello '
>>> 

 

课后习题:

1. 请问以下这行代码会打印什么内容?

>>> '{{{1}}}'.format('no print','print') #外层{}对中间层{}转义,输出{};中间的{1}对应的format()参数的索引位置是1
'{print}'
>>> '{{1}}'.format('no print','print') #这个1被解释掉了
'{1}'
>>> 

 

2. 以下代码中,a, b, c是什么参数?

关键字参数

>>> "{a} love {b}.{c}".format(a="I", b="FishC", c="com")
'I love FishC.com'
>>> 

 

3. 以下代码中,{0}, {1}, {2}是什么参数?

 位置参数

>>> "{0} love {1}.{2}".format("I", "FishC", "com")
'I love FishC.com'
>>> 

 

4. 如果想要显示Pi = 3.14,format前边的字符串应该怎么填写呢?

>>> "{0}{1:.2f}".format('Pi= ',3.1415)
'Pi= 3.14'
>>> 

 

动动手:

0. 编写一个进制转换程序,程序演示如下(提示,十进制转换二进制可以用bin()这个BIF):

q=True
while q:
    num=input('请输入一个十进制的整数(输入Q结束程序):')
    if num !='Q':
        num=int(num)
        print(('十进制->十六进制: %d -> %x') % (num,num))
        print(('十进制->八进制: %d -> %o') % (num,num))
        print(('十进制->二进制: %d -> ') % num,bin(num))
    else:
        q=False

演示结果:

请输入一个十进制的整数(输入Q结束程序):9
十进制->十六进制: 9 -> 0x9
十进制->八进制: 9 -> 0o11
十进制->二进制: 9 ->  0b1001
请输入一个十进制的整数(输入Q结束程序):