跟老齐学Python之从格式化表达式到方法


Posted in Python onSeptember 28, 2014

现在我们就格式化方法做一个详细一点的交代。

基本的操作

所谓格式化方法,就是可以先建立一个输出字符串的模板,然后用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'

对上面的综合一下,稍微??乱坏愕氖笛椋?/p>

>>> 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的Twisted框架的核心特性
May 25 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
python中的RSA加密与解密实例解析
Nov 18 Python
python加载自定义词典实例
Dec 06 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
Python pymsql模块的使用
Sep 07 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
跟老齐学Python之print详解
Sep 28 #Python
跟老齐学Python之正规地说一句话
Sep 28 #Python
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 #Python
跟老齐学Python之不要红头文件(2)
Sep 28 #Python
跟老齐学Python之不要红头文件(1)
Sep 28 #Python
python自动化测试之连接几组测试包实例
Sep 28 #Python
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 #Python
You might like
PHP动态创建Web站点的方法
2011/08/14 PHP
写出高质量的PHP程序
2012/02/04 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
js实现碰撞检测
2021/01/29 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
详解使用Python处理文件目录的相关方法
2015/10/16 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Python 基础教程之包和类的用法
2017/02/23 Python
python爬取m3u8连接的视频
2018/02/28 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Python中断多重循环的思路总结
2019/10/04 Python
vue常用指令代码实例总结
2020/03/16 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
小学生美德少年事迹
2014/02/02 职场文书
创业计划书如何编写
2014/02/06 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
导游词之长城八达岭
2019/09/24 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL