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实现KNN分类算法
Dec 22 Python
python3实现基于用户的协同过滤
May 31 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
python nmap实现端口扫描器教程
May 28 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
基于Python生成个性二维码过程详解
Mar 05 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 Python
python 如何在list中找Topk的数值和索引
May 20 Python
用python批量解压带密码的压缩包
May 31 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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学习之function的用法
2012/07/14 PHP
php抓取页面的几种方法详解
2013/06/17 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python设计模式大全
2016/06/27 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
党课培训主持词
2014/04/01 职场文书
单位单身证明样本
2014/10/11 职场文书
店铺转让协议书
2014/12/02 职场文书
2014年优秀党员材料
2014/12/18 职场文书
幼儿教师个人总结
2015/02/05 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python
Python代码实现双链表
2022/05/25 Python