B站|公众号:啥都会一点的研究生
相关阅读
整理了几个100%会踩的Python细节坑,提前防止脑血栓
整理了十个100%提高效率的Python编程技巧,更上一层楼
Python-列表,从基础到进阶用法大总结,进来查漏补缺
Python-元组,从基础到进阶用法大总结及与列表核心区别,进来查漏补缺
Python-字典,从基础到进阶用法大总结,进来查漏补缺
Python-集合,从基础到进阶大总结,进来查漏补缺
订阅专栏 ===> Python
哈喽我是啥都生,本期整理了几个100%提高你Python代码质量的技巧,一起来看看吧~
case 1
第一个,使用元组或字典进行解包传参,像如下这种函数定义方式在Python中是相当常见的,为比较常规的传参方式
def product(a, b):
return a * b
res = product(3, 4)
print(res) # 12
但其实,使用元组与字典也极为方便,尤其是字典方式,工程中由于参数较多,经常将以字典对象将键值存于py文件中
def product(a, b):
return a * b
arg_tuple = (3, 4)
arg_dict = {'a': 3, 'b': 4}
print(product(*arg_tuple)) # 12
print(product(**arg_dict)) # 12
此外,同样的适用于函数返回值的解包
def product(a, b):
return a * b
def fn_iterable():
return 3, 4
def fn_dict():
return {'a': 3, 'b': 4}
print(product(*fn_iterable())) # 12
print(product(**fn_dict())) # 12
像fn_iterable,其返回值就是元组,只是换上了敌军的衣服隐藏起来了
def fn_iterable():
return 3, 4
res = fn_iterable()
print(type(res)) # <class 'tuple'>
case 2
下一个,在Python中,其实布尔值也可以当做整数值使用
,可以不这么用,但看了这么多期总结,这个知识点必须让你们知道,True相当于1,False相当于0,同样适用于各类运算与索引等场景中
isinstance为True,a<=5也为True,打印结果为2,a % 2 == 0为False,列表索引为0,结果为is odd
a = 3
print(isinstance(a, int) + (a <= 5)) # 2
print(["is odd", "is even"][a % 2 == 0]) # is odd
case 3
说到布尔值,你可能不知道,Python3中,在循环中直接使用True或者False是可能带来耗时问题,为方便说明问题,首先定义一个函数如下
def test_true():
count = 100
while True: # here is True
if count < 0:
break
count -= 1
我们知道,除开None、False、0、非空等都能表示True,将上述例子while True更改如下
def test_1():
count = 100
while 1: # here is 1
if count < 0:
break
count -= 1
接下来,借助timeit库,我们来综合对比下运行100万次两种方法耗时,在我的机器上结果如下,性能越好差异越小,为什么会这样呢?因为Python3中似乎将True或False也当成了变量,不要小看这种提升,简单改变就能带来改进,积累起来很可怕的~
from timeit import timeit
def test_true():
count = 100
while True: # here is True
if count < 0:
break
count -= 1
def test_1():
count = 100
while 1: # here is 1
if count < 0:
break
count -= 1
print(timeit(test_true, number=1000000)) # 1.9993100020219572
print(timeit(test_1, number=1000000)) # 1.9615642849821597
case 4
关于布尔耗时,这个例子也挺有意思,使用bool()方法获得真实性其实是较慢的,因为它是全局变量,需要在多个命名空间进行查找
class L:
def __init__(self):
self.some_val = 5
def __bool__(self):
return bool(self.some_val)
l = L()
那么如何改善呢,很简单,使用not
可以带来性能上的提升,not not与bool()的效果是相同的
class F:
def __init__(self):
self.some_val = 5
def __bool__(self):
return not not self.some_val
f = F()
同样的,引入timeit库进行对比,在我的机器上结果如下,可以看到对比还是挺明显的
import timeit
slow_setup = """
class L:
def __init__(self):
self.some_val = 5
def __bool__(self):
return bool(self.some_val)
l = L()
"""
fast_setup = """
class F:
def __init__(self):
self.some_val = 5
def __bool__(self):
return not not self.some_val
f = F()
"""
print(timeit.timeit('l.__bool__()', slow_setup)) # 0.12642534699989483
print(timeit.timeit('f.__bool__()', fast_setup)) # 0.08172031096182764
case 5
关于布尔值,Python有两种常见的条件赋值方式都与其极其相关,第一种是标准的三元表达式
b = True
print(True if b else False) # True
b = False
print(True if b else False) # False
第二种,我们经常也会借助or达到目的,请一定一定注意,如果第一个值是假的,则自动返回第二个值,即使该值也是假的,这里稍不注意就出错
b = None or False
print(b) # False
b = False or None
print(b) # None
case 6
下一个,如果想print一个很长的字符串,往往使得整个程序排版难看
long_text = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
如果你将其变成如下形式,上述问题就解决啦
long_text = ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
以上就是本期的全部内容,该系列仍将继续更新,点赞关注鼓励下吧~