你所不知道的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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
简析Python的闭包和装饰器
Feb 26 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
django 通过URL访问上传的文件方法
Jul 28 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
15种PHP Encoder的比较
2007/03/06 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
详解vue高级特性
2020/06/09 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
pandas按条件筛选数据的实现
2021/02/20 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
java程序员面试交流
2012/11/29 面试题
公司节能减排倡议书
2014/05/14 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
环保项目建议书
2014/08/26 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
Python实现归一化算法详情
2022/03/18 Python