手摸手教你如何在 Python 编码中做到小细节大优化
手摸手教你如何在 Python 编码中做到小细节大优化
在列表里计数
"""
在列表里计数,使用 Python 原生函数计数要快很多,所以尽量使用原生函数来计算。
"""
elements = list(range(1, 1000001))
# 常见写法
num = 0
for n in elements:
num += 1
# 建议写法
len(elements)
过滤一个列表
"""
过滤一个列表,推导列表的方式最快。
"""
elements = list(range(1, 1000001))
# 第一种,常见写法
l = []
for e in elements:
if e % 2:
l.append(e)
# 第二种,常见写法。filter 增加了复杂度,返回一个迭代对象再用 list 转成一个列表,这样会增加开销。
list(filter(lambda e : e % 2, elements))
# 建议写法,推导的方式性能最佳
[e for e in elements if e % 2]
使用异常检查属性
"""
灵活使用异常检查属性
"""
class User(object):
name = 'Python'
# 常见写法,通过内置函数 hasattr 检查,查找内部类的属性增加了开销。
user = User()
if hasattr(user, 'name'):
user.name
# 建议写法,通过异常捕获
start = timeit.default_timer()
try:
user.name
except AttributeError:
pass
检查列表元素
"""
检查列表元素
"""
elements = list(range(1, 1000001))
# 常见写法,使用循环的方式检查
def check_number(n):
for e in elements:
if e == n:
return True
return False
check_number(10000)
# 建议写法,直接使用 in 检查列表
10000 in elements
列表去重
"""
列表去重
"""
elements = list(range(1, 10001))
# 常见写法,使用循环的去重列表
u = []
for e in elements:
if e not in u:
u.append(e)
# 建议写法,使用 set 对列表去重
set(elements)
列表排序
"""
列表排序
"""
elements = list(range(1, 100001))
# 常见写法,sorted 函数会把原来的列表进行排序后,再返回一个新的列表。
sorted(elements)
# 建议写法,sort 函数直接在原来的列表上排序。
start = timeit.default_timer()
elements.sort()
将迭代循环放入函数
"""
将迭代循环放入函数
"""
# 常见写法,循环调用 1000 函数。
def cube(n):
return n**3
cubes = [cube(e) for e in range(1000)]
# 建议写法,把重复的循环一次性塞入函数。
def compute_cubes():
return [e**3 for e in range(1000)]
compute_cubes()
检查是否为 True
"""
检查是否为 True
"""
var = True
# 第一种,常见写法。== 会调用魔术函数 __eq__ 来比较左右两边的类型。
if var == True:
pass
# 第二种,常见写法。使用 is 来判断。
if var is True:
pass
# 建议写法,直接使用这种方式来判断,是否为空、是否为 None、是否为空 list、是否为空 dict 会比较快。
if var:
pass
检查列表是否为空
"""
检查列表是否为空
"""
l = []
# 第一种,常见写法。
if len(l) == 0:
pass
# 第二种,常见写法。
if l == []:
pass
# 建议写法,这种方式最快。
if not l:
pass
生成一个 list 或 dict
"""
生成一个 list or dict
"""
# 常见写法,使用 list 生成一个对象,会产生开销。
list()
# 建议写法,[] 直接返回一个 list,开销较小。
[]
# 第三种方式,{} 直接返回一个 dict,开销较小。
{}
链式比较
# 常见写法
a = 5
if a > 1 and a < 7:
pass
# 建议写法
if 1 < a < 7:
pass
变量交换
# 常见写法
x = 10
y = 5
tmp = x
x = y
y = tmp
# 建议写法
x = 10
y = 5
x, y = y, x
三目运算符
# 常见写法
a = 10
b = 5
if a > b:
c = a
else:
c = b
# 建议写法
c = a if a > b else b
拼接字符列表
# 常见写法
l = ['a', 'b', 'c', 'd']
str = ''
for e in l:
str = str + e
# 建议写法
str = ''.join(l)
格式化字符
# 常见写法
name = "tony"
age = 100
str = "myname : " + name + " my age : " + str(age)
str = "myname : %s my age : %d" % (name, age)
# 建议写法
str = "myname : {} my age {}".format(name, age)
过滤列表
# 常见写法
mylist = range(20)
odd_list = []
for e in mylist:
if e % 2 == 1:
odd_list.append(e)
# 建议写法
odd_list = [e for e in mylist if e % 2 == 1]
过滤字典
# 常见写法
user_list = [{'name': 'lucy', 'email': 'lucy@g.com'}, {'name': 'lily', 'email': 'lily@g.com'}]
user_email = {}
for user in user_list:
if 'email' in user:
user_email[user['name']] = user['email']
# 建议写法
{user['name']: user['email'] for user in user_list if 'email' in user}
条件判断
# 常见写法
if l = []:
pass
# 建议写法
if l:
pass
# 常见写法
if something == None:
pass
# 建议写法
if something is None:
pass
emumerate 代替 for 循环中的对 index 变量的访问
# 常见写法
my_container = ['lily', 'lucy', 'tom']
index = 0
for element in my_container:
print('{} {}'.format(index, element))
index += 1
# 建议写法
for index, element in enumerate(my_container):
print('{} {}'.format(index, element))
避免使用可变(mutable)变量作为函数参数的默认初始化值
# 常见写法
def function(l = []):
l.append(1)
return l
print function()
print function()
print function()
# print
[1]
[1, 1]
[1, 1, 1]
# 建议写法,使用 None 作为可变对象占位符
def function(l=None):
if l is None:
l = []
l.append(1)
return l
用字典对象完成 switch case 的功能
# 常见写法
def apply_operation(left_operand, right_operand, operator):
if operator == '+':
return left_operand + right_operand
elif operator == '-':
return left_operand - right_operand
elif operator == '*':
return left_operand * right_operand
elif operator == '/':
return left_operand / right_operand
# 建议写法
def apply_operation(left_operand, right_operand, operator):
import operator as op
operator_mapper = {'+': op.add, '-': op.sub, '*': op.mul, '/': op.truediv}
return operator_mapper[operator](left_operand, right_operand)
一切皆对象
# 常见写法
def get_size(some_object):
try:
return len(some_object)
except TypeError:
if some_object in (True, False, None):
return 1
else:
return int(some_object)
print(get_size('hello'))
print(get_size([1, 2, 3, 4, 5]))
print(get_size(10.0))
# 建议写法
def get_size(some_object):
if isinstance(some_object, (list, dict, str, tuple)):
return len(some_object)
elif isinstance(some_object, (bool, type(None))):
return 1
elif isinstance(some_object, (int, float)):
return int(some_object)
手摸手教你如何在 Python 编码中做到小细节大优化的更多相关文章
- iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画
如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...
- 手摸手教你微信小程序开发之自定义组件
前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...
- 手摸手教你让Laravel开发Api更得心应手
https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...
- 【转】手摸手,带你用vue撸后台 系列一
前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...
- 手摸手带你用Hexo撸博客(二)之配置主题
在上一篇博客手摸手带你用Hexo撸博客(一)中主要介绍了博客的初步搭建 今天我们继续讲如何在Hexo搭建的博客中应用主题 官网选择自己喜欢的主题 点击这里Hexo主题进入官网主题页面 然后选择自己喜欢 ...
- 手摸手带你用Hexo撸博客(一)
原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...
- 手摸手,和你一起学习 UiPath Studio
学习 RPA 的路上坑比较多,让我们手摸手,一起走…… 以下是一些学习 UiPath 和 RPA 的资源, 拿走不用谢! UiPath Studio 中文文档 机器人流程自动化其实是很好的概念和技术, ...
- 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)
前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...
- 【转】手摸手,带你用vue撸后台 系列三(实战篇)
前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...
随机推荐
- js 复杂研究
function test_001() { var t =0; return t || out_str("t未定义"), //1 // 执行1句;在执行2句; t||null // ...
- Android 内存泄漏优化总结
1,验证是否为汉字 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...
- 我的docker笔记
下面的链接全部是我在CSDN的关于docker的博文,我认为已经很是详细了,没有再次总结的必要性,特给出链接地址 docker容器技术基础 https://blog.csdn.net/zisefeiz ...
- [CSP-S模拟测试]:666(模拟)
题目描述 不忘初心. 小$\pi$假期在家无聊,打开了某弹幕直播网站. 突然,有一个精彩的镜头. 小$\pi$看到了满屏的$6$,其中,有$666$.也有$666666$.也有$6666666666. ...
- 京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?
你真的了解volatile关键字吗?http://blog.csdn.net/FansUnion/article/details/79495080 面试题:为什么最后两行没有运行?http://blo ...
- Chrome 66 新增异步剪贴板 API
在过去的几年里我们只能使用 document.execCommand 来操作剪贴板.不过,这种操作剪贴板的操作是同步的,并且只能读取和写入 DOM. 现在 Chrome 66 已经支持了新的 Asyn ...
- Type.MakeGenericType 方法 (Type[]) 泛型反射
替代由当前泛型类型定义的类型参数组成的类型数组的元素,并返回表示结果构造类型的 Type 对象. 命名空间: System程序集: mscorlib(mscorlib.dll 中) public ...
- vundle就是vim bundle的插件管理成ide
如何配置一个高效的php编辑环境, 很好 对vundle的操作, 除了仓库名称是vundle.git (*.git就是仓库) 和 本地目录名是 vundle之外, 其他的操作都是bundle git ...
- JavaScript对象的常用属性及使用
什么是浏览器对象模型? 浏览器对象模型(BOM Browser Object Model)是JavaScript的组成之一,它提供了独立于内容和浏览器窗口进行交互的对象,使用浏览器对象模型可以实现与H ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_2 mybatis注解开发测试和使用注意事项
新建测试类 这里使用了main方法进行测试 InputStream需要抛出异常 写完进行测试 测试结果 讲解 把第一天的IUserDao.xml文件复制到当前的工程里面 红色的取值要用的.黄色的是执行 ...