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中编写ORM框架的入门指引
Apr 29 Python
python实现将元祖转换成数组的方法
May 04 Python
python数据结构之图的实现方法
Jul 08 Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 Python
Python语言描述连续子数组的最大和
Jan 04 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
基于tensorflow权重文件的解读
May 26 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 iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
jQuery横向擦除焦点图特效代码分享
2015/09/06 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
酒吧总经理岗位职责
2013/12/10 职场文书
竞聘演讲稿
2014/04/24 职场文书
公司领导班子对照材料
2014/08/18 职场文书
琅琊山导游词
2015/02/05 职场文书
大学生个人总结范文
2015/02/15 职场文书
超市主管竞聘书
2015/09/15 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript
PyTorch中的torch.cat简单介绍
2022/03/17 Python