你所不知道的Python奇技淫巧13招【实用】


Posted in Python onDecember 14, 2016

有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写。其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你一样可以写出像诗一样的Python代码。

1.导入模块

你是不是经常对调用模块时输入一长串模块索引感到头疼?说实在的,数量少的时候或许还可以勉强忍受,一旦程序规模上去了,这也是一项不容小觑的工程。

#Bad
import urllib.request
url = r'http://www.landsblog.com'
req = urllib.request.Request(url)
response = urllib.request.urlopen(req)
#Good
form urllib import request 
url = r'http://www.landsblog.com'
req = request.Request(url)
response = request.urlopen(req)

这样是不是节省了一点时间呢?

但是这样简写可能造成模块名重复的问题,如何解决呢?

from module_a import fun as a_fun
from module_b import fun as b_fun

这样的方法还适用于模块名比较长的模块,笔者印象最深的就是BeautifulSoup模块

from bs4 import BeautifulSoup as BS
html = '''
  <html>
   ......
  </html>
  '''
soup = BS(html)

省时省力。

2.关于 "_" ##

这是一个非常有用的功能,可惜很少人知道。

当你在交互界面敲代码,获得一个临时结果,却没有用变量名去保存它的时候,可以用"_"来获取最近一次临时结果。

>>> 1 + 1
2
>>> _
2

在"_"中存储最后输出的值。这在交互式模式中是非常有用的,当你在过程中没有保存计算结果,或者你想看最后一步执行的输出结果。

3.合并字符串

这是一个老生常谈的问题,当我们需要将数个字符串合并的时候,习惯性的使用"+"作为连接字符串的手段。

然而,由于不可变对象在内存中生成后无法修改,合并后的字符串会重新开辟出一块内存空间来存储。这样像滚雪球一样,将内存快速消耗殆尽。

# Bad
string = ['a','b','c','d','e','f','g','h']
def fun(string):
 all_string = ''
 for i in string:
  all_string += i
 return all_string
# Good
string = ['a','b','c','d','e','f','g,'h']
def fun(string):
 all_string = ''.join(string)
 return all_string

4.强大的zip()

它是Python的内建函数,zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个包含tuple的list。zip()函数可以在很多场景简化你的代码。

矩阵的行列互换

# Bad
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
re_a = [[row[col] for row in a] for col in range(len(a))]
>>> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# Good
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
re_a = list(zip(*a))
>>> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

交换dict的键值

# Bad
a = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
def reverse_dict(a):
 new_dict = {}
 for k,v in m.items():
  new_dict[v] = k
 return new_dict
# Good
a = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
def reverse_dict(a):
 k = a.keys()
 v = a.values()
 new_dict = dict(zip(v, k))
 return new_dict

合并list相邻项

a = [1, 2, 3, 4, 5, 6]
list(zip( a[::2], a[1::2] ))
>>> [(1, 2), (3, 4), (5, 6)]

5.变量值交换

# Bad
tmp = a
a = b
b = tmp
#Good
a, b = b, a

6.在循环中获取索引(数组下标)?

a = [8, 23, 45, 12, 78]
for index, value in enumerate(a):
print(index , value)

7.如何在只用一行捕获多个异常?

try:
 pass
except (ExceptionA,ExceptionB,.....) as e:
 pass

8.把列表分割成同样大小的块?

a = [1, 2, 3, 4, 5, 6]
list(zip( *[iter(a)]*2 ))
>>> [(1, 2), (3, 4), (5, 6)]

9.如何查找列表中某个元素的下标?

a = ['a', 'b', 'c', 'd', 'e', 'f']
a_i = a.index(a)
>>> 0

10.如何快速反转字符串?

#Bad
a = 'Python is a powerful languange.'
list_a = list(a)
list_a.reverse()
re_a = ''.join(list_a) 
#Good
a = 'Python is a powerful languange.'
re_a = a[::-1]
11.数值比较
x = 2
if 1< x <3:
 print(x)
>>> 2
if 1< x >0:
 print(x)
>>> 2

12.优雅的打开文件

平时在使用类似文件的流对象时,使用完毕后要调用close方法关闭。with…as语句提供了一个非常方便的替代方法:open打开文件后将返回的文件流对象赋值给f,然后在with语句块中使用。with语句块完毕之后,会隐藏地自动关闭文件。

with open('nothing.txt','r') as f:
 f.read()

13.和你的内存说再见

crash = dict(zip(range(10 **0xA), range(10 **0xA)))

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Python 相关文章推荐
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
python获取指定时间差的时间实例详解
Apr 11 Python
Python函数式编程
Jul 20 Python
python微信公众号开发简单流程
Mar 23 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python 生成VOC格式的标签实例
Mar 10 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 Python
pandas数值排序的实现实例
Jul 25 Python
Python制作表白爱心合集
Jan 22 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 #Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 #Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 #Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 #Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 #Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 #Python
详解python3百度指数抓取实例
Dec 12 #Python
You might like
php操作SVN版本服务器类代码
2011/11/27 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
javascript判断网页是关闭还是刷新
2015/09/12 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
调解协议书
2014/04/16 职场文书
公安学专业求职信
2014/07/27 职场文书
信访工作汇报材料
2014/10/27 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技