你所不知道的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中for循环下的索引变量的作用域
Apr 15 Python
Python使用minidom读写xml的方法
Jun 03 Python
在Python程序中操作MySQL的基本方法
Jul 29 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
python paramiko模块学习分享
Aug 23 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python 实现多线程下载视频的代码
Nov 15 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
python可视化大屏库big_screen示例详解
Nov 23 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
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
推荐文章系统(一)
2006/10/09 PHP
php获取网页内容方法总结
2008/12/04 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
python多线程扫描端口示例
2014/01/16 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python 对key为时间的dict排序方法
2018/10/17 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
书法培训心得体会
2014/01/05 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
产假请假条
2014/04/10 职场文书
学前班评语大全
2014/05/04 职场文书
物业品质提升方案
2014/06/08 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
秋收起义观后感
2015/06/11 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL