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实现网站的模拟登录
Jan 04 Python
Python设计模式编程中解释器模式的简单程序示例分享
Mar 02 Python
Python对文件操作知识汇总
May 15 Python
python网络编程调用recv函数完整接收数据的三种方法
Mar 31 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python实现AES加密与解密
Mar 28 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
Python中的list与tuple集合区别解析
Oct 12 Python
TensorBoard 计算图的查看方式
Feb 15 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
Python天气语音播报小助手
Sep 25 Python
详解Python内置模块Collections
Mar 22 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调用三种数据库的方法(1)
2006/10/09 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
redux处理异步action解决方案
2020/03/22 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
Python实现115网盘自动下载的方法
2014/09/30 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
使用Python处理BAM的方法
2018/09/28 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
详解python中*号的用法
2019/10/21 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
Java语言的优势
2015/01/10 面试题
《开国大典》教学反思
2014/04/19 职场文书
求职简历自我评价范文
2015/03/10 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang