手摸手教你如何在 Python 编码中做到小细节大优化#
在列表里计数#
Copy
"""
在列表里计数,使用 Python 原生函数计数要快很多,所以尽量使用原生函数来计算。
"""
elements = list (range (1 , 1000001 ))
num = 0
for n in elements:
num += 1
len (elements)
过滤一个列表#
Copy
"""
过滤一个列表,推导列表的方式最快。
"""
elements = list (range (1 , 1000001 ))
l = []
for e in elements:
if e % 2 :
l.append(e)
list (filter (lambda e : e % 2 , elements))
[e for e in elements if e % 2 ]
使用异常检查属性#
Copy
"""
灵活使用异常检查属性
"""
class User (object ):
name = 'Python'
user = User()
if hasattr (user, 'name' ):
user.name
start = timeit.default_timer()
try :
user.name
except AttributeError:
pass
检查列表元素#
Copy
"""
检查列表元素
"""
elements = list (range (1 , 1000001 ))
def check_number (n ):
for e in elements:
if e == n:
return True
return False
check_number(10000 )
10000 in elements
列表去重#
Copy
"""
列表去重
"""
elements = list (range (1 , 10001 ))
u = []
for e in elements:
if e not in u:
u.append(e)
set (elements)
列表排序#
Copy
"""
列表排序
"""
elements = list (range (1 , 100001 ))
sorted (elements)
start = timeit.default_timer()
elements.sort()
将迭代循环放入函数#
Copy
"""
将迭代循环放入函数
"""
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#
Copy
"""
检查是否为 True
"""
var = True
if var == True :
pass
if var is True :
pass
if var:
pass
检查列表是否为空#
Copy
"""
检查列表是否为空
"""
l = []
if len (l) == 0 :
pass
if l == []:
pass
if not l:
pass
生成一个 list 或 dict#
Copy
"""
生成一个 list or dict
"""
list ()
[]
{}
链式比较#
Copy
# 常见写法
a = 5
if a > 1 and a < 7:
pass
# 建议写法
if 1 < a < 7:
pass
变量交换#
Copy
x = 10
y = 5
tmp = x
x = y
y = tmp
x = 10
y = 5
x, y = y, x
三目运算符#
Copy
a = 10
b = 5
if a > b:
c = a
else:
c = b
c = a if a > b else b
拼接字符列表#
Copy
l = ['a' , 'b' , 'c' , 'd' ]
str = ''
for e in l:
str = str + e
str = '' .join(l)
格式化字符#
Copy
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)
过滤列表#
Copy
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]
过滤字典#
Copy
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 }
条件判断#
Copy
if l = []:
pass
if l:
pass
if something == None :
pass
if something is None :
pass
emumerate 代替 for 循环中的对 index 变量的访问#
Copy
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)变量作为函数参数的默认初始化值#
Copy
# 常见写法
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 的功能#
Copy
# 常见写法
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)
一切皆对象#
Copy
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)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战