Python中一些不为人知的基础技巧总结


Posted in Python onMay 19, 2018

前言

本文主要给大家总结介绍了关于Python的一些基础技巧,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1.startswith()和endswith()参数可以是元组

当检测字符串开头或结尾时,如果有多个检测值,可以用元组作为startswith()和endswith()参数:

# bad
if image.endswith('.jpg') or image.endswith('.png') or image.endswith('.gif'):
 pass
# good
if image.endswith(('.jpg', '.png', '.gif')):
 pass
# bad
if url.startswith('http:') or url.startswith('https:') or url.startswith('ftp:'):
 pass
# good
if url.startswith(('http:', 'https:', 'ftp:')):
 pass

2.enumerate()设置start参数做为索引起始值

当用enumerate()迭代同时要得到索引时,可以设置start参数作为索引起始值:

# bad
for index, v in enumerate(data):
 print(index+1, v)
# good
for index, v in enumerate(data, start=1):
 print(index, v)

3.对切片命名

当代码中到处都是硬编码的切片索引时,我们的代码将变得无法阅读。可以对切片命名解决此问题:

record = '....................100.................513.25......'
# bad
cost = int(record[20:23]) * float(record[40:46])
# good
SHARES = slice(20, 23)
PRICE = slice(40, 46)
cost = int(record[SHARES]) * float(record[PRICE])

作为一条基本准则,代码中如果有很多硬编码的索引值,将导致可读性合可维护性都不佳。一般来说,内置的slice()函数会创建一个切片对象,可以用在任何允许进行切片操作的地方。例如:

>>> items = [0, 1, 2, 3, 4, 5, 6]
>>> a = slice(2, 4)
>>> items[2:4]
[2, 3]
>>> items[a]
[2, 3]
>>> items[a] = [-2, -3]
>>> items
[0, 1, -2, -3, 4, 5, 6]
>>> del items[a]
>>> items
[0, 1, 4, 5, 6]
>>>

4.上下文管理器可以同时管理多个资源

假设你要读取一个文件的内容,经过处理以后,写入到另一个文件。你能写出pythonic的代码,所以你使用了上下文管理器,满意地的写出了下面这样的代码:

with open('input.txt', 'r') as source:
 with open('output.txt', 'w') as target:
  target.write(source.read())

你已经做的很好了,但是上下文管理器可以同时管理多个资源,上面这段代码还可以这样写:

with open('input.txt', 'r') as source, open('output.txt', 'w') as target:
  target.write(source.read())

5.else子句

Python中的else子句不仅能在if语句中使用,还能在for、while、和try语句中使用。

在for循环或是while循环正常运行完毕时(而不是通过break语句或是return语句或是异常退出循环),才会运行else块。

举个例子:

>>> for i in range(3):
...  print(i)
... else:
...  print('Iterated over everything')
... 
0
1
2
Iterated over everything
>>>

如上,for循环正常结束,所以运行了后面的else块。

>>> for i in range(3):
...  if i == 2:
...   break
...  print(i)
... else:
...  print('Iterated over everything')
... 
0
1
>>>

由此可以看出,for循环如果没有正常运行完毕(如上面是break结束循环的),是不会运行后面的else块。

仅当try块中没有异常抛出时才运行else块。一开始,你可能觉得没必要在try/except块中使用else子句。毕竟,在下述代码片段中,只有dangerous_call()不抛出异常,after_call()才会执行,对吧?

try:
 dangerous_call()
 after_call()
except OSError:
 log('OSError...')

然而,after_call()不应该放在try块中。为了清晰明确,try块中应该只包括抛出预期异常的语句。因此,向下面这样写更好:

try:
 dangerous_call()
except OSError:
 log('OSError...')
else:
 after_call()

现在很明确,try块防守的是dangerous_call()可能出现的错误,而不是after_call()。而且很明显,只有try块不抛出异常,才会执行after_call()。但要注意一点,else子句抛出的异常不会由前面的except子句处理,也就是说此时after_call()如果抛出异常,将不会被捕获到。

还有更多的python技巧,大家可以参考这篇文章:https://3water.com/article/137695.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Python 中的Selenium异常处理实例代码
May 03 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
Python延迟绑定问题原理及解决方案
Aug 04 Python
python函数超时自动退出的实操方法
Dec 28 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
利用Python实现模拟登录知乎
May 25 Python
Python + selenium自动化环境搭建的完整步骤
May 19 #Python
pandas中去除指定字符的实例
May 18 #Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 #Python
对pandas replace函数的使用方法小结
May 18 #Python
基于DataFrame筛选数据与loc的用法详解
May 18 #Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 #Python
pandas.loc 选取指定列进行操作的实例
May 18 #Python
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
jquery ajax 登录验证实现代码
2009/09/23 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python机器学习之神经网络(二)
2017/12/20 Python
Python使用wxPython实现计算器
2018/01/30 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
毕业生如何写自我鉴定
2014/03/15 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
2015暑假假期总结
2015/07/13 职场文书