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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Saltstack快速入门简单汇总
Mar 01 Python
Python算法应用实战之栈详解
Feb 04 Python
python+opencv识别图片中的圆形
Mar 25 Python
python 字符串和整数的转换方法
Jun 25 Python
详解python读取和输出到txt
Mar 29 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 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中基本符号及使用方法
2010/03/23 PHP
php文件读取方法实例分析
2015/06/20 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
JScript的条件编译
2007/05/29 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
Python备份Mysql脚本
2008/08/11 Python
Python中实现常量(Const)功能
2015/01/28 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
TensorFlow实现Batch Normalization
2018/03/08 Python
python实现两个文件合并功能
2018/04/01 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
市场营销专科应届生求职信
2013/11/24 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
Python学习之迭代器详解
2022/04/01 Python