1.用if elif else
2.def f(x):
return {
0:"you typed zero.\n",
1:"you are in top.\n",
2:"n is an even number\n"
}.get(x,"Only single-digit numbers are allowed\n")
注意添加文档注释:3对”—> 注释要清楚地描述方法的功能,并对参数,返回值以及可能发生的异常进行说明
推荐在文件头包含copyright 声明,模块的描述等,如有必要,可以考虑加入作者的信息及变更记录
like:
"""
Licensed Materials - Property of CorpA
(C) Copyright A Corp.1999, 2011 All Rights Reserved
CopyRight statement and purpose....
------------------------------------------------------
File Name : comments.py
Description: description what the main function of this file
Author: LF
change Activity:
list the change activity and time and author information
-----------------------------------------------------------
"""
避免不必要的计算 eg:if x or y 当x为 true时就直接返回 不用计算y
if x and y false ——— 像这种就是利用了lazy
节省空间,使用无限循环的数据结构成为可能
eg:生成器表达式 a= (x for x in range(100))—>不会立即生成数据列表 用的时候才会生成 print(a[9])
with open(xx_file_name,'rb') as f:
f.read()
__repr__()
方法,而__str__()
则为可选,没有__str__()
,则默认会使用__repr__()
s = (
'aaaaa'
'bbbb'
'ccccc'
)
''.split() ==> [] ''.split(' ') ==> ['']
from collections import Counter
some_data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z']
print Counter(some_data)
>>>Counter({'a': 3, '2': 2, 4: 2, 5: 2, 2: 1, 'b': 1, 7: 1, 'd': 1, 'z': 1})
# 取值
xx = Counter(some_data)
print xx.['a']
class Test(object):
is_instance = None
is_first = True
def __new__(cls, *args, **kwargs):
if cls.is_instance == None:
cls.is_instance = object.__new__(cls)
return cls.is_instance
def __init__(self, name):
if Test.is_first:
self.name = name
Test.is_first = False
test1 = Test('lf1')
print(id(test1)) # 2136967041656
print(test1.name) # lf1
test2 = Test('lf2')
print(id(test2)) # 2136967041656
print(test2.name) # lf1
发布订阅模式(publish/subscribe)是一种编程模式,
消息的发送者将消息分为不同的类别直接发布,并不关注订阅者是谁;
订阅者直接接收感兴趣的消息,并不关注发布者是谁;
优点是 发布者 与 订阅者松散的耦合,双方不需要知道对方的存在.
* 简单例子
## Broker.py
from collections import defaultdict
route_table = defaultdict(list)
def sub(topic, callback):
if callback in route_table[topic]:
return
route_table[topic].append(callback)
def pub(topic, *a, **kw):
for func in route_table[topic]:
func(*a, **kw)
## main.py
import Broker
def greeting(name):
print('hello, %s.' % name)
Broker.sub('greet', greeting) # 发布者
Broker.pub('greet', 'LaiYonghao') # 订阅者
程序运行慢的原因有很多,但真正的原因往往是一两段设计并不那么良好的不起眼的程序.程序性能影响往往符合8/2法则,即20%的代码运行时间占用了80%的总运行时间(实际上,比例要夸张得多,通常是几十行代码占用了95%以上的运行时间)
profile是python的标准库,可以统计程序里每一函数的运行时间,并提供了多样的报表,cprofile则是它的C实现版本,剖析过程本身需要消耗的资源更少.
## test_cprofile.py
import time
def foo():
sum = 0
for i in range(100):
sum += i
time.sleep(.5)
return sum
if __name__ == "__main__":
foo()
现在使用profile分析这个程序.
if __name__ =="__main__":
import cProfile
cProfile.run("foo()")
输出如下
第二种方式:python -m cProfile test_cprofile.py
统计项 | 意义 |
---|---|
ncalls | 函数的调用次数 |
tottime | 函数总计运行时间,不含调用的函数运行时间 |
percall | 函数运行一次的平均时间,等于tottime/ncalls |
cumtime | 函数总计运行时间,含调用的函数运行时间 |
percall | 函数运行一次的平均时间,等于cumtime/ncalls |
filename:lineno(function) | 函数所在的文件名,函数的行号,函数名 |
将cProfile的输出保存到文件,并以各种形式来查看结果.
1.使用cProfile.run()函数再提供一个实参,就是保存输出的文件名;同样,在命令行参数里,多一个参数,用来保存cProfile的输出
2.通过pstats模块的另一个类Stats来解决.
# ....略
if __name__ == "__main__":
import cProfile
cProfile.run("foo()", "prof.txt")
import pstats
p = pstats.Stats("prof.txt")
# sort_stats(key,[...]) 以key排序 print_stats()输出结果
p.sort_stats("time").print_stats()
sort_stats的key
参数 | 参数的意义 |
---|---|
ncalls | 被调用次数 |
cumulative | 函数运行的总时间 |
file | 文件名 |
module | 模块名 |
pcalls | 简单调用统计(兼容旧版,未统计递归调用) |
line | 行号 |
name | 函数名 |
nfl | Name,file,line |
stdname | 标准函数名 |
time | 函数内部运行时间(不计调用子函数的时间) |
# 1
for i in range(iter):
d = math.sqrt(y)
j += i*d
# 2 比第一种快 40%~60%
d = math.sqrt(y)
for i in range(iter):
j += i*d
"""求等差数列1,2,3,...n的和"""
# 1
sum = 0
n = 10
for i in range(n+1):
sum = sum + i
print(sum)
# 2 直接用数学知识 n*(n+1)/2 负面影响就是牺牲了代码的可读性 需添加清晰和恰当的注释是非常必要的
n = 10
print(n*(n+1)/2)
# 1
x = [10,34,56,78]
def f(x):
for i in range(len(x)):
x[i] = math.sin(x[i])
return x
# 2 性能提高10%~15%
def g(x):
loc_sin = math.sin
for i in range(len(x)):
x[i] = loc_sin(x[i])
return x
# 1
for i in range(len(v1)):
for j in range(len(v2)):
x = v1p[i]+ v2[j]
# 2
for i in range(len(v1)):
vli = v1[i]
for j in range(len(v2)):
x = vli + v2[j]
编写高质量代码 改善Python程序的91个建议 读后总结(上述代码为python3实现)