天天看點

詳解字元串的format⽅法的使用 | 手把手教你入門Python之三十

上一篇: 介紹2種成員運算符 | 手把手教你入門Python之二十九 下一篇: 列表的基本使用介紹 | 手把手教你入門Python之三十一 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。

1. 概念:

str.format() ⽅法通過字元串中的⼤括号 {} 來識别替換字段 replacement field ,從⽽完成字元串的格式化。

替換字段 由字段名 field name 和轉換字段 conversion field 以及格式說明符format specifier 組成,即⼀般形式為 {字段名!轉換字段:格式說明符}。

字段名分為簡單字段名 simple field name 和複合字段名 compound field name 。⽽轉換字段和格式說明符都是可選的。

2. 字段名

form的完整格式是{字段名!轉換字元:格式說明符}。其中字段名師必須的,⽽且可以分為簡單字段名和複合字段名。

2.1 簡單字段名

簡單字段名由三中寫法:

  • 省略字段名: {}
  • 使⽤⾮負⼗進制整數 {0}
  • 變量名{name}
詳解字元串的format⽅法的使用 | 手把手教你入門Python之三十

2.1.1 省略字段名

⼤括号内省略字段名,傳遞位置參數。

  • 替換字段形式: {}
  • 注意:⼤括号個數可以少于位置參數的個數,反之不然。
# 省略字段名傳遞位置參數
print('我叫{},今年{}歲。'.format('⼩明', 18))
"""
我叫⼩明,今年18歲。
"""
# ⼤括号個數可以少于位置參數的個數
print('我愛吃{}和{}。'.format('⾹蕉', '蘋果', '⼤鴨梨'))
"""
我愛吃⾹蕉和蘋果。
"""
# ⼤括号個數多于位置參數的個數則會報錯
# print('我還吃{}和{}。'.format('⻄紅柿'))
"""
IndexError: tuple index out of range
"""           

2.1.2 數字字段名

可以通過數字形式的簡單字段名傳遞位置參數。

數字必須是⼤于等于 0 的整數。

帶數字的替換字段可以重複使⽤。

數字形式的簡單字段名相當于把 format 中的所有位置參數整體當作⼀個元組,通過字段名中的數字進⾏

取值。即 {0} 等價于 tuple[0],是以⼤括号内的數字不能越界。

# 通過數字形式的簡單字段名傳遞位置參數
print('身⾼{0},家住{1}。'.format(1.8, '銅鑼灣'))
"""
身⾼1.8,家住銅鑼灣
"""
# 數字形式的簡單字段名可以重複使⽤。
print('我愛{0}。\n她今年{1}。\n我也愛{0}。'.format('阿⾹', 17))
"""
我愛阿⾹。
她今年17。
我也愛阿⾹。
"""
# 體會把所有位置參數整體當成元組來取值
print('阿⾹愛吃{1}、{3}和{0}。'.format(
 '榴蓮', '臭⾖腐', '⽪蛋', '鲱⻥罐頭', '螺獅粉'))
"""
阿⾹愛吃臭⾖腐、鲱⻥罐頭和榴蓮。
"""
# 嘗試⼀下越界錯誤
# print('{1}'.format('錯誤⽤法'))
"""
IndexError: tuple index out of range
"""           

2.1.3 變量字段名

使⽤變量名形式的簡單字段名傳遞關鍵字參數。

  • 關鍵字參數的位置可以随意調換。
# 使⽤變量名形式的簡單字段名傳遞關鍵字參數
print('我⼤哥是{name},今年{age}歲。'.format(name='阿⻜', age=20))
"""
我⼤哥是阿⻜,今年20歲。
"""
# 關鍵字參數的順序可以随意調換
print('我⼤哥是{name},今年{age}歲。'.format(age=20, name='阿⻜'))
"""
我⼤哥是阿⻜,今年20歲。
"""           

2.1.4 簡單字段名的混合使⽤

  • 混合使⽤數字形式和變量名形式的字段名,可以同時傳遞位置參數和關鍵字參數。
  • 關鍵字參數必須位于位置參數之後。
  • 混合使⽤時可以省略數字。

    省略字段名 {} 不能和數字形式的字段名 {⾮負整數} 同時使⽤。

# 混合使⽤數字形式和變量名形式的字段名
# 可以同時傳遞位置參數和關鍵字參數
print('這是⼀個關于{0}、{1}和{girl}的故事。'.format(
 '⼩明', '阿⻜', girl='阿⾹'))
"""
這是⼀個關于⼩明、阿⻜和阿⾹的故事。
"""
# 但是關鍵字參數必須位于位置參數之後
# print('這是⼀個關于{0}、{1}和{girl}的故事。'.format(
 # '⼩明', girl='阿⾹' , '阿⻜'))
"""
SyntaxError: positional argument follows keyword argument
"""
# 數字也可以省略
print('這是⼀個關于{}、{}和{girl}的故事。'.format(
 '⼩明', '阿⻜', girl='阿⾹'))
# 但是省略字段名不能和數字形式的字段名同時出現
# print('這是⼀個關于{}、{1}和{girl}的故事。'.format(
# '⼩明', '阿⻜', girl='阿⾹'))
"""
ValueError: cannot switch from automatic field numbering to manual field specifica
tion
"""           
詳解字元串的format⽅法的使用 | 手把手教你入門Python之三十
詳解字元串的format⽅法的使用 | 手把手教你入門Python之三十

2.1.5 使⽤元組和字典傳參

str.format() ⽅法還可以使⽤ 元組 和 *字典 的形式傳參,兩者可以混合使⽤。 位置參數、關

鍵字參數、 元組 和 字典 也可以同時使⽤,但是要注意,位置參數要在關鍵字參數前⾯, 元組

要在 **字典 前⾯。

# 使⽤元組傳參
infos = '鋼鐵俠', 66, '⼩辣椒'
print('我是{},身價{}億。'.format(*infos))
"""
我是鋼鐵俠,身家66億。
"""
print('我是{2},身價{1}億。'.format(*infos))
"""
我是⼩辣椒,身家66億。
"""
# 使⽤字典傳參
venom = {'name': '毒液', 'weakness': '⽕'}
print('我是{name},我怕{weakness}。'.format(**venom))
"""
我是毒液,我怕⽕。
"""
# 同時使⽤元組和字典傳參
hulk = '綠巨⼈', '拳頭'
captain = {'name': '美國隊⻓', 'weapon': '盾'}
print('我是{}, 我怕{weapon}。'.format(*hulk, **captain))
print('我是{name}, 我怕{1}。'.format(*hulk, **captain))
"""
我是綠巨⼈, 我怕盾。
我是美國隊⻓, 我怕拳頭。
"""
# 同時使⽤位置參數、元組、關鍵字參數、字典傳參
# 注意:
# 位置參數要在關鍵字參數前⾯
# *元組要在**字典前⾯
tup = '鷹眼',
dic = {'weapon': '箭'}
text = '我是{1},我怕{weakness}。我是{0},我⽤{weapon}。'
text = text.format(
 *tup, '⿊寡婦', weakness='男⼈', **dic)
print(text)
"""
我是⿊寡婦,我怕男⼈。我是鷹眼,我⽤箭。
"""           

2.2 複合字段名

  • 同時使⽤了數字和變量名兩種形式的字段名就是複合字段名。
  • 複合字段名

⽀持兩種操作符:

. 點号

[] 中括号

2.2.1 使⽤ . 點号

傳遞位置參數

  • 替換字段形式: {數字.屬性名}
  • 隻有⼀個替換字段的時候可以省略數字
class Person(object):
 def __init__(self,name,age,gender):
 self.name = name
 self.age = age
 self.gender = gender
p = Person('zhangsan',18,'female')
print('姓名是{0.name},年齡是{0.age},性别是{0.gender}'.format(p))
print('姓名是{.name}'.format(p)) # 隻有⼀個替換字段時,可以省略數字           

2.2. 使⽤ [] 中括号

  • ⽤清單傳遞位置參數
  • ⽤元組傳遞位置參數
  • ⽤字典傳遞位置參數
# 中括号⽤法:⽤清單傳遞位置參數
infos = ['阿星', 9527]
food = ['霸王花', '爆⽶花']
print('我叫{0[0]},警号{0[1]},愛吃{1[0]}。'.format(
 infos, food))
"""
我叫阿星,警号9527,愛吃霸王花。
"""
# 中括号⽤法:⽤元組傳遞位置參數
food = ('僵⼫', '腦⼦')
print('我叫{0[0]},年齡{1},愛吃{0[1]}。'.format(
 food, 66))
"""
我叫僵⼫,年齡66,愛吃腦⼦。
"""
# 中括号⽤法:⽤字典傳遞位置參數
dic = dict(name='阿星', pid=9527)
print('我是{[name]}!'.format(
 dic))
# 多個替換字段,不能省略數字
print('我是{0[name]},警号{0[pid]}。'.format(
 dic))
"""
我是阿星!
我是阿星,警号9527。
"""           

3. 轉換字段

轉換字段 conversion field 的取值有三種,前⾯要加 ! :

  • s :傳遞參數之前先對參數調⽤ str()
  • r :傳遞參數之前先對參數調⽤ repr()
  • a :傳遞參數之前先對參數調⽤ ascii()

    ascii() 函數類似 repr() 函數,傳回⼀個可以表示對象的字元串。 但是對于⾮ ASCII 字

符,使⽤ x , u 或者 U 轉義。

# 轉換字段
print('I am {!s}!'.format('Bruce Lee 李⼩⻰'))
print('I am {!r}!'.format('Bruce Lee 李⼩⻰'))
print('I am {!a}!'.format('Bruce Lee 李⼩⻰'))
"""
I am Bruce Lee 李⼩⻰!
I am 'Bruce Lee 李⼩⻰'!
I am 'Bruce Lee \u674e\u5c0f\u9f99'!
"""
           

4. 格式說明符

格式說明符使⽤過于複雜,且實際使⽤場景不多,暫不讨論。