提升Python编程效率的几种方法
前言
我们知道Python这门语言在运行速度上已经败给了许多别的语言(比如C, C++, Java, Golang....).但从一个开发者的角度来看Python是我最喜欢的语言,很大一部分原因在于其语法简单(其实是我比较懒),还有很多很sao的操作,可以大大提高我们的敲代码的效率.我们通常叫这种sao操作为pythonic.
Python的sao操作很多,这里先介绍几种,以后慢慢更.
1.交换两个变量
传统写法:
temp = a
a = b
b = temp
pythonic:
a, b = b, a
2.枚举enumerate
设想一个场景,有一个列表["老胡", "老王", "老李", "老赵"],现在要求你创建一个字典,其中字典的每一项key为列表的元素,value为对应元素的下标,该怎么做?这并不是枚举的最佳使用场景,这里只是一个例子,告诉你们枚举其实很好用.
传统写法:
alist = ["老胡", "老王", "老李", "老赵"]
aDict = {}
for i in range(len(alist)):
aDict[alist[i]] = i
pythonic:
alist = ["老胡", "老王", "老李", "老赵"]
aDict = {}
for index, item in enumerate(alist):
aDict[item] = index
3.推导式
Python中的推导式分为三种列表推导式,字典推导式,集合推导式,由于集合推导式和列表推导式神似这里就不在过多演示.
列表推导式
设想一个场景,要求你把1-100间的所有偶数放到列表evenList中
传统写法:
evenList = []
for i in range(0, 101):
if i % 2 == 0:
evenList.append(i)
pythonic:
evenList = [i for i in range(0,101) if i % 2 == 0]
只用一行代码是不是很爽呢.
给出列表推导式的规范:
variable = [out_exp for out_exp in input_list if 某个条件成立]
字典推导式
设想一个场景,这里要求你把一个字典里所有的key和value位置交换
传统写法:
ADict = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
BDict = {}
for key, value in ADict.items():
BDict[value] = key
pythonic:
ADict = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
BDict = {value: key for key, value in ADict.items()}
熟练使用推导式可以让你的代码变得十分的简短!
4.lambda表达式
这无疑是一个非常重要的语法,然而很多新手却不喜欢使用...
所谓lambda表达式就是匿名函数,我们为什么要使用匿名函数呢?有些时候我们想要使用一个函数但是整个程序中只需要使用这一次,这时候使用lambda表达式无疑最方便了
设想一个场景,有一个列表里面存放着一对对的元组,现在要按元组的第二个元素对该列表进行排序
传统方法:
aList = [(2, 3), (1, 2), (4, 5), (7, 4)]
def sortKey(x):
return x[1]
aList.sort(key=sortKey) # 注意不要写成aList = aList.sort(key=sortKey),它没有返回值
print(aList)
out:
[(1, 2), (2, 3), (7, 4), (4, 5)]
pythonic:
aList = [(2, 3), (1, 2), (4, 5), (7, 4)]
aList.sort(key=lambda x: x[1])
out:
[(1, 2), (2, 3), (7, 4), (4, 5)]
给出规范:
lambda 参数:操作(参数)
注意后面的操作(参数)是要返回的
举个例子:
add = lambda x, y: x + y
# 等价于下面的函数
def add(x, y):
return x + y
5.装饰器
装饰器是Python非常非常非常重要的知识点,这里只做应用举例,以后我会出一期详细的讲解装饰器
设想一个场景,公司有好多的部门(函数)在同时运作,现在要求你在不改变运行代码的条件下,给每个部门新加一个功能
源代码:
def partA():
print("----do A job----")
def partB():
print("----do B job----")
def partC():
print("----do C job----")
if __name__ == '__main__':
partA()
partB()
partC()
out:
----do A job----
----do B job----
----do C job----
传统方法:
def partA():
print("----do A job----")
print("****do extra job****")
def partB():
print("----do B job----")
print("****do extra job****")
def partC():
print("----do C job----")
print("****do extra job****")
if __name__ == '__main__':
partA()
partB()
partC()
out:
----do A job----
****do extra job****
----do B job----
****do extra job****
----do C job----
****do extra job****
pythonic:
def doExtraJob(func):
def wrap():
func()
print("****do extra job****")
return wrap
@doExtraJob
def partA():
print("----do A job----")
@doExtraJob
def partB():
print("----do B job----")
@doExtraJob
def partC():
print("----do C job----")
if __name__ == '__main__':
partA()
partB()
partC()
out:
----do A job----
****do extra job****
----do B job----
****do extra job****
----do C job----
****do extra job****
对比两种方法,使用装饰器的效果就是可以让一个函数再不改变内部代码的情况下增加新的功能.
6.神奇的else语句
大部分人只知道else语句和if语句一起使用,但是你们知道吗else语句也可以和for语句,while语句,try语句一起使用
设想一个场景,你在对一个内部数据未知的列表进行循环时(不论是for还是while),你设置了一个遇到偶数就break的语句,倘若数组里不含偶数就输出奇数列表字样.
传统方法:
aList = [1, 3, 5, 7, 9]
flag = True
for i in aList:
if i % 2 == 0:
flag = False
break
if flag:
print("奇数列表")
pythonic:
aList = [1, 3, 5, 7, 9]
for i in aList:
if i % 2 == 0:
break
else:
print("奇数列表")
注意,循环中(for或while)的else语句会在循环正常退出时(即不是由于break语句退出时)触发
对与try,else语句,else语句会在没有异常时被触发,也许你们会有疑问,没有异常直接在try语句里不是解决了吗,但是try语句里的操作会被捕获,有些时候我们并不想这样.
看个例子:
try:
assert True
except:
print("出错了")
else:
print("没有错")
out:
没有错
assert为断言当其后面的语句为假是会报出异常,这和try语句一起使用有时候会非常的方便.
7.map函数
map函数会将一个函数映射到一个列表的所有元素上去.这和lambda表达式配合简直完美.
设想一个场景,一个列表里有1-10十个数,现要求你将这个列表里的每一个数的平方存入另一个列表,这并不难
传统方法:
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = []
for i in aList:
bList.append(i**2)
pythonic:
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = list(map(lambda x:x**2, aList))
千万注意map函数返回的不是列表是个map对象,需要类型转换
8.filter函数
没错从函数的名字就可以看出filter函数的功能是过滤,filter可以过滤一个列表的元素并返回所有符合要求的元素组成的filter对象,和map类似注意类型转换.
设想一个场景,有一个列表,里面存放着一些未知的数字,现在要求你把所有的偶数挑选出来,
传统方法:
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = []
for each in aList:
if each % 2 == 0:
bList.append(each)
pythonic:
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = list(filter(lambda x: not x % 2, aList))
这里使用not是因为偶数除2的余数为0(Python中0为False),为了让偶数时返回True,用来一个not
9.reduce函数
注意:和前两个函数不同,reduce函数被放到了functools这个模块里,使用时需要导入.
reduce函数会将一个列表里的所有元素都用一个函数进行运算,要求这个函数必须有两个参数.
设想一个场景,要求求一个数字列表里所有的数字的平均值.
传统方法:
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sum = 0
for i in aList:
sum += i
ave = sum / len(aList)
pythonic:
from functools import reduce
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ave = reduce(lambda x, y: x + y, aList) / len(aList)
map,filter,reduce函数和lambda配合使用才是精华所在.还有千万别弄混三个函数的功能
| 函数名 | 功能 | 返回值 |
|---|---|---|
| map | 单纯的将一个函数映射到一个列表的所有元素上去 | map对象 |
| filter | 过滤一个列表的元素并返回所有符合要求的元素组成的filter对象 | filter对象 |
| reduce | 将一个列表里的所有元素都用一个函数进行运算 | 计算结果 |
10.总结
Python的sao操作还有很多,这次希望这次带来的几个用法对你们有所帮助,对于刚接触的人来说很容易忘记,希望大家可以多动手敲敲代码加强记忆,看看你们之前写的代码可不可以用这些sao操作改一改,使你的代码看上去更加精简.
提升Python编程效率的几种方法的更多相关文章
- Python下载网页的几种方法
get和post方式总结 get方式:以URL字串本身传递数据参数,在服务器端可以从'QUERY_STRING'这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在 ...
- Python字符串连接的5种方法
总结了一下Python字符串连接的5种方法: 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用 "+" 来连接两个字符串: ...
- 用Python计算幂的两种方法,非递归和递归法
用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...
- 提高SQL查询效率的30种方法
转载:提高SQL查询效率的30种方法 内容摘录如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中 ...
- Python保留小数的几种方法
Python保留小数的几种方法 1.使用字符串格式化 print("%.2f"%a) 2.使用round内置函数 round(num,2) 3.使用Decimal模块 from d ...
- Selenium2+python自动化65-js定位几种方法总结
Selenium2+python自动化65-js定位几种方法总结 前言 本篇总结了几种js常用的定位元素方法,并用js点击按钮,对input输入框输入文本 一.以下总结了5种js定位的方法 除了i ...
- python字符串连接的三种方法及其效率、适用场景详解
python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website=& 39;python& 39;+& 39;tab& 39;+& ...
- C 程序提升效率的10种方法
本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1). 1. 避免不必要的函数调用 考虑下面的2个函数: void s ...
- 转:python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...
随机推荐
- P1078 字符串压缩与解压
P1078 字符串压缩与解压 转跳点:
- 面试题之xml解析?
题目是:用java程序将xml中的数据保存到实体对象中,如何实现? xml如下: <?xml version="1.0" encoding="UTF-8" ...
- maven intall 命令用法
作用:将自定义maven项目 打成maven依赖存放到本地库,我们可以在另一个项目pom文件中加入相应依赖,刷新mavne即可将其加入项目中使用 使用说明:win+R 打开命令窗口,将目录切换至项目 ...
- Redis详解(八)——企业级解决方案
Redis详解(八)--企业级解决方案 缓存预热 缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统.避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓 ...
- 阿里云https+nginx服务搭建
购买证书 通过控制台进入CA证书服务,点击右上角的购买证书,进入如下图的界面,选择免费的Symantec的DV SSL. 一路点过去,然后回到证书服务主页,会出现一条订单信息,点击补全,如下图所示. ...
- mysql使用的坑
一: mysql默认是安装记录的物理顺序取数据的,如果不加order by 排序,可能得不到预期的结果. (1) 获取 两个时间点的 id (很快) $sql = ‘select id from a ...
- hadoop ozone入门
简介 众所周知,HDFS是大数据存储系统,并在业界得到了广泛的使用.但是无论大集群还是小集群其扩展性都受NameNode的限制,虽然HDFS可以通过Federation进行扩展,但是依然深受小文件和4 ...
- UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)
题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所 ...
- UVA - 10305 Ordering Tasks(拓扑排序)
题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, &quo ...
- Day4-T3
原题目 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散 落民间几百年的珍宝——月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工 匠们用金线连 ...