锁定老帖子 主题:避免劣化的python代码
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-04
劣:
found = False for i in foo: if i == 0: found = True break if not found: print("i was never 0") 优: for i in foo: if i == 0: break else: print("i was never 0") |
|
返回顶楼 | |
发表时间:2010-12-04
最后修改:2010-12-04
超级技巧,可用于列表对比:
>>> a = set([1,2,3,4]) >>> b = set([3,4,5,6]) >>> a | b # Union {1, 2, 3, 4, 5, 6} >>> a & b # Intersection {3, 4} >>> a < b # Subset False >>> a - b # Difference {1, 2} >>> a ^ b # Symmetric Difference {1, 2, 5, 6} |
|
返回顶楼 | |
发表时间:2010-12-04
最后修改:2010-12-04
小伎俩:
>>> str(round(1234.5678, -2)) '1200.0' >>> str(round(1234.5678, 2)) '1234.57' >>> dict(foo=1, bar=2) {'foo': 1, 'bar': 2} |
|
返回顶楼 | |
发表时间:2010-12-04
排序的小技巧:
a = [(2, "b"), (1, "a"), (2, "a"), (3, "c")] print sorted(a) #[(1, 'a'), (2, 'a'), (2, 'b'), (3, 'c')] a = [{2:"b"},{1:"a"}, {2:"a"}] print sorted(a) [{1: 'a'}, {2: 'a'}, {2: 'b'}] |
|
返回顶楼 | |
发表时间:2010-12-04
>>> names = ['Bob', 'Marie', 'Alice'] >>> ages = [23, 27, 36] >>> dict(zip(names, ages)) {'Alice': 36, 'Bob': 23, 'Marie': 27} |
|
返回顶楼 | |
发表时间:2010-12-06
duka 写道 劣:
found = False for i in foo: if i == 0: found = True break if not found: print("i was never 0") 优: for i in foo: if i == 0: break else: print("i was never 0") 可能found标志位在后续代码还用得上。 路过,我主业是用C或C++,只是觉得python不用编译比较方便,比C总是更简洁的。所以我既不想学另一套思维方式(怕走火入魔~~),又想利用python的便利。一直在使用劣化python中…… |
|
返回顶楼 | |
发表时间:2010-12-08
盖茨他爹 写道 第一个用列表解析更高效
另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少 没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语 |
|
返回顶楼 | |
发表时间:2010-12-08
edison0951 写道 盖茨他爹 写道 第一个用列表解析更高效
另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少 没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语 import itertools import time l = range(1000000) def test1(): time1 = time.clock() l2 = [str(i) for i in l] time2 = time.clock() print time2-time1 def test2(): time1 = time.clock() l2 = map(str, l) time2 = time.clock() print time2-time1 def test3(): time1 = time.clock() for i in itertools.imap(str, l): pass time2 = time.clock() print time2-time1 test1() test2() test3() 测试结果: 1.38556706794 0.642326404896 1.74044392476 map最快,列表解析次之,itertools.imap最慢 |
|
返回顶楼 | |
发表时间:2010-12-11
最后修改:2010-12-11
java程序员飘过,一直使用大众看得懂的所谓“劣化代码”中,而且以后还会继续用。
|
|
返回顶楼 | |
发表时间:2010-12-15
最后修改:2010-12-15
盖茨他爹 写道 edison0951 写道 盖茨他爹 写道 第一个用列表解析更高效
另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少 没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语 import itertools import time l = range(1000000) def test1(): time1 = time.clock() l2 = [str(i) for i in l] time2 = time.clock() print time2-time1 def test2(): time1 = time.clock() l2 = map(str, l) time2 = time.clock() print time2-time1 def test3(): time1 = time.clock() for i in itertools.imap(str, l): pass time2 = time.clock() print time2-time1 test1() test2() test3() 测试结果: 1.38556706794 0.642326404896 1.74044392476 map最快,列表解析次之,itertools.imap最慢 迭代器的好处貌似是内存占用小,因为是一个一个执行输出的,而不是一下输出一个完整的列表。文档中还是比较提倡这种写法的。 楼主的写法也可以算作FP编程风格的优点。 函数映射,类似于多态 lst=['a', 'b', 'c'] func={1:prt1, 2:prt2} def prt1(l): [print(t) for t in l] #这种写法在这不一定合适,只是与map是等效的,语法上更简洁一些。 def prt2(l): [print(ord(t)) for t in l] def prt(l, para): func[para](l) prt(lst, 1) prt(lst, 2) |
|
返回顶楼 | |