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进阶教程之异常处理
Aug 30 Python
python的即时标记项目练习笔记
Sep 18 Python
Python线程的两种编程方式
Apr 14 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
详解Python time库的使用
Oct 10 Python
python基于gevent实现并发下载器代码实例
Nov 01 Python
10个Python面试常问的问题(小结)
Nov 20 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python/golang实现循环链表的示例代码
Sep 14 Python
python通过函数名调用函数的几种场景
Sep 23 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
javascript 面向对象继承
2009/11/26 Javascript
javascript parseInt与Number函数的区别
2010/01/21 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
JS JQuery获取data-*属性值方法解析
2020/09/01 jQuery
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Python使用MD5加密字符串示例
2014/08/22 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
学Python 3的理由和必要性
2019/11/19 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
安全宣传标语
2014/06/10 职场文书
高中班主任评语
2014/12/30 职场文书
高二语文教学反思
2016/02/16 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript