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中break语句的用法
May 14 Python
python实现多线程抓取知乎用户
Dec 12 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
python3实现高效的端口扫描
Aug 31 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Django模板获取field的verbose_name实例
May 19 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
用python开发一款操作MySQL的小工具
May 12 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
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
php中namespace及use用法分析
2016/12/06 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
详解webpack分包及异步加载套路
2017/06/29 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
Python中关于使用模块的基础知识
2015/05/24 Python
Python算法之图的遍历
2017/11/16 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Numpy array数据的增、删、改、查实例
2018/06/04 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
2015年乡镇党务公开工作总结
2015/05/19 职场文书
焦点访谈观后感
2015/06/11 职场文书
Oracle笔记
2021/04/05 Oracle
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
Spring Boot 实现 WebSocket
2022/04/30 Java/Android