手摸手教你如何在 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 编码中做到小细节大优化的更多相关文章

  1. iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

    如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...

  2. 手摸手教你微信小程序开发之自定义组件

    前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现 ...

  3. 手摸手教你让Laravel开发Api更得心应手

    https://www.guaosi.com/2019/02/26/laravel-api-initialization-preparation/ 1. 起因 随着前后端完全分离,PHP也基本告别了v ...

  4. 【转】手摸手,带你用vue撸后台 系列一

    前言 说好的教程终于来了,第一篇文章主要来说一说在开始写业务代码前的一些准备工作吧,但这里不会教你webpack的基础配置,热更新怎么做,webpack速度优化等等,有需求的请自行google. 目录 ...

  5. 手摸手带你用Hexo撸博客(二)之配置主题

    在上一篇博客手摸手带你用Hexo撸博客(一)中主要介绍了博客的初步搭建 今天我们继续讲如何在Hexo搭建的博客中应用主题 官网选择自己喜欢的主题 点击这里Hexo主题进入官网主题页面 然后选择自己喜欢 ...

  6. 手摸手带你用Hexo撸博客(一)

    原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...

  7. 手摸手,和你一起学习 UiPath Studio

    学习 RPA 的路上坑比较多,让我们手摸手,一起走…… 以下是一些学习 UiPath 和 RPA 的资源, 拿走不用谢! UiPath Studio 中文文档 机器人流程自动化其实是很好的概念和技术, ...

  8. 【转】手摸手,带你用vue撸后台 系列二(登录权限篇)

    前言 拖更有点严重,过了半个月才写了第二篇教程.无奈自己是一个业务猿,每天被我司的产品虐的死去活来,之前又病了一下休息了几天,大家见谅. 进入正题,做后台项目区别于做其它的项目,权限验证与安全性是非常 ...

  9. 【转】手摸手,带你用vue撸后台 系列三(实战篇)

    前言 在前面两篇文章中已经把基础工作环境构建完成,也已经把后台核心的登录和权限完成了,现在手摸手,一起进入实操. Element 去年十月份开始用vue做管理后台的时候毫不犹豫的就选择了Elemen, ...

随机推荐

  1. layui.form is not a function

    改变: var form = layui.form; 如果你是从1.x升级2.x造成的,那只需要在定义的时候吧后面的()去掉就可以了.请关注更新日志:1.x 升 2.0 特别注意事项layDate日期 ...

  2. mysql jdbcTemplate访问

    String sql = "select * from xxx_photo_info where user_id in (:userIds)"; userIds从dao传过来时必须 ...

  3. 洛谷 P1080 石子合并 ( 区间DP )

    题意 : 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成1堆 ...

  4. Java 生成二进制加减法题目

    日常算数,有益身心健康. int a; int b; int result; int symbol; int count = 50; Random random = new Random(); for ...

  5. 第十一周java学习总结

    目录 第十一周java学习总结 学习内容 学习总结 提交代码截图 代码推送 第十一周java学习总结 学习内容 第13章 Java网络编程 主要内容 URL类 InetAdress类 套接字 UDP数 ...

  6. 转载 用ShadowVolume画模型的影子

    阅读目录(Content) Shadow Volume 包围盒 动态生成包围盒 判断 多光源下的阴影 总结 问题 CSharpGL(48)用ShadowVolume画模型的影子 回到顶部(go to ...

  7. JWT原理和使用

    jwt JSON Web Tokens,是一种开发的行业标准RFC 7519,用于安全的表示双方之间的声明.目前,jwt广泛的用在系统的用户认证方面,特别是前后端分离项目. 1.jwt认证流程 在项目 ...

  8. Python学习之==>文件操作

    1.打开文件的模式 r,只读模式(默认)[不可写:文件不存在,会报错] w,只写模式[不可读:不存在则创建:存在则删除内容] a,追加模式[不可读:不存在则创建:存在则追加内容] r+,读写模式[可读 ...

  9. windows7如何用键盘模拟鼠标操作

    windows7如何用键盘模拟鼠标操作 https://jingyan.baidu.com/article/6dad5075104907a123e36e38.html 听语音 37453人看了这个视频 ...

  10. sql 、linq、lambda 查询语句

    http://www.cnblogs.com/lei2007/archive/2011/07/21/2113161.html