[上一講](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/202.md),主要介紹了用%表達的一種輸出格式化表達式。在那一講最后又拓展了一點東西,拓展的那點,名曰:格式化方法。因為它知識上是使用了str的**format**方法。
現在我們就格式化方法做一個詳細一點的交代。
## 基本的操作
所謂格式化方法,就是可以先建立一個輸出字符串的模板,然后用format來填充模板的內容。
~~~
>>> #先做一個字符串模板
>>> template = "My name is {0}. My website is {1}. I am writing {2}."
>>> #用format依次對應模板中的序號內容
>>> template.format("qiwsir","qiwsir.github.io","python")
'My name is qiwsir. My website is qiwsir.github.io. I am writing python.'
~~~
當然,上面的操作如果你要這樣做,也是可以的:
~~~
>>> "My name is {0}. My website is {1}. I am writing {2}.".format("qiwsir","qiwsir.github.io","python")
'My name is qiwsir. My website is qiwsir.github.io. I am writing python.'
~~~
這些,跟用%寫的表達式沒有什么太大的區別。不過看官別著急,一般小孩子都區別不到,長大了才有區別的。慢慢看,慢慢實驗。
除了可以按照對應順序(類似占位符了)填充模板中的位置之外,還能這樣,用關鍵字來指明所應該田中的內容。
~~~
>>> template = "My name is {name}. My website is {site}"
>>> template.format(site='qiwsir.github.io', name='qiwsir')
'My name is qiwsir. My website is qiwsir.github.io'
~~~
關鍵詞所指定的內容,也不一定非是str,其它的數據類型也可以。此外,關鍵詞和前面的位置編號,還可以混用。比如:
~~~
>>> "{number} is in {all}. {0} are my number.".format("seven",number=7,all=[1,2,3,4,5,6,7,8,9,0])
'7 is in [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]. seven are my number.'
~~~
是不是開始感覺有點意思了?看輸出結果,就知道,經過format方法得到是一個新的str。
## 序列對象的偏移量
有這樣一個要求:在輸出中,顯示出一個單詞的第一個字母和第三個個字母。比如單詞python,要告訴看官,第一字母是p,第三個字母是t。
這個問題并不難。實現方法也不少,這里主要是要展示一下偏移量在format中的應用。
~~~
>>> template = "First={0[0]}, Third={0[2]}"
>>> template.format(word)
'First=p, Third=t'
~~~
list也是序列類型的,其偏移量也可。
~~~
>>> word_lst = list(word)
>>> word_lst
['p', 'y', 't', 'h', 'o', 'n']
>>> template
'First={0[0]}, Third={0[2]}'
>>> template.format(word_lst)
'First=p, Third=t'
~~~
對上面的綜合一下,稍微啰嗦一點的實驗:
~~~
>>> template = "The word is {0}, Its first is {0[0]}. Another word is {1}, Its second is {1[1]}."
>>> template.format("python","learn")
'The word is python, Its first is p. Another word is learn, Its second is e.'
>>> "{name}\'s first is {name[0]}".format(name="qiwsir") #指定關鍵詞的值的偏移量
"qiwsir's first is q"
~~~
值得注意的是,偏移量在序列類型的數據中,因為可以是負數,即能夠從右邊開始計數。
~~~
>>> word
'python'
>>> word[-1]
'n'
>>> word[-2]
'o'
~~~
但是,在模板中,無法使用負數的偏移量。
~~~
>>> "First={0[0]}, End={0[-1]}".format(word) #報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers, not str
>>> "First={0[0]}, End={0[5]}".format(word) #把-1改為5就可以了。
'First=p, End=n'
~~~
當然,放到模板外面是完全可行的。這樣就好了:
~~~
>>> "First={0}, End={1}".format(word[0],word[-1])
'First=p, End=n'
~~~
## dictionary的鍵
直接上實驗,先觀察,再得結論
~~~
>>> myinfo
{'website': 'qiwsir.github.io', 'name': 'qiwsir', 'room': 703}
>>> template = "I am {0[name]}"
>>> template.format(myinfo)
'I am qiwsir'
>>> template = "I am {0[name]}. My QQ is {qq}"
>>> template.format(myinfo,qq="26066913")
'I am qiwsir. My QQ is 26066913'
~~~
位置后面跟鍵,就能得到format的參數中字典的鍵對應的值。太羅嗦了吧,看例子就明白了。出了根據位置得到,還能夠根據關鍵詞得到:
~~~
>>> myinfo
{'website': 'qiwsir.github.io', 'name': 'qiwsir', 'room': 703}
>>> "my website is {info[website]}, and I like {0}".format("python",info=myinfo) #關鍵詞info引用的是一個字典
'my website is qiwsir.github.io, and I like python'
~~~
## 模板中添加屬性
看標題不懂在說什么。那就看實驗吧。
~~~
>>> import math
>>> "PI is {PI.pi}".format(PI=math)
'PI is 3.14159265359'
~~~
這是用關鍵詞,下面換個稍微復雜點,用位置的。
~~~
>>> import sys,math
>>> 'PI is {0.pi}. My lptop runs {1.platform}'.format(math,sys)
'PI is 3.14159265359\. My lptop runs linux2'
~~~
看官理解了吧。
## 其它進制
在這個世界上的數學領域,除了有我們常常用到的十進制、十二進制(幾點了,這是你我常用到的,鐘表面就是12進制)、六十進制(這個你也熟悉的)外,還有別的進制,比如二進制、八進制、十六進制等等。此處不談進制問題,有興趣詳細了解,請各自google。不過,進制的確在計算機上很重要的。因為機器在最底層是用二進制的。
這里只是說明一下輸出時候的進制問題。
~~~
>>> "{0:X}, {1:o}, {2:b}".format(255,255,255)
'FF, 377, 11111111'
~~~
* X:十六進制,Hex
* o:八進制,octal
* b:二進制,binary
順便補充,對于數的格式化方法輸出和格式化表達式一樣,就不贅述了。
在格式化方法中,還能夠指定字符寬度,左右對齊等簡單排版格式,不過,在我的經驗中,這些似乎用的不怎么多。如果看官需要,可以google或者到官方文檔看看即可。
關于格式化表達式和格式化方法,有的人進行了不少比較,有的人說用這個,有的人傾向用那個。我的建議是,你用哪個順手就用哪個。切忌門派之見呀。不過,有人傳說格式化表達式可能在將來某個版本中廢除。那是將來的事情,將來再說好了。現在,你就撿著順手的用吧。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python