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之再深点,更懂list
Sep 20 Python
Python中使用select模块实现非阻塞的IO
Feb 03 Python
Python编写屏幕截图程序方法
Feb 18 Python
详解Python中的序列化与反序列化的使用
Jun 30 Python
python字典的常用操作方法小结
May 16 Python
Python制作钉钉加密/解密工具
Dec 07 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
用python实现对比两张图片的不同
Feb 05 Python
深入浅析Python中的迭代器
Jun 04 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
Python如何将装饰器定义为类
Jul 30 Python
python3判断IP地址的方法
Mar 04 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脚本加密专家php解密算法
2020/09/13 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
总结表彰大会主持词
2014/03/26 职场文书