第015講:字符串:格式化 (課後測試題及答案)

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結束程序):

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章