你所不知道的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中函数的多种格式和使用实例及小技巧
Apr 13 Python
python 默认参数问题的陷阱
Feb 29 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
python实现银联支付和支付宝支付接入
May 07 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
Django中的cookie和session
Aug 27 Python
基于matplotlib xticks用法详解
Apr 16 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
pandas按条件筛选数据的实现
Feb 20 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学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python3图片文件批量重命名处理
2019/10/31 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
一套软件测试笔试题
2014/07/25 面试题
销售总经理岗位职责
2014/03/15 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
2014年医院工作总结
2014/11/20 职场文书