论坛首页 编程语言技术论坛

避免劣化的python代码

浏览 15569 次
精华帖 (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")
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}
0 请登录后投票
   发表时间: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}
0 请登录后投票
   发表时间: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'}]
0 请登录后投票
   发表时间:2010-12-04  
>>> names = ['Bob', 'Marie', 'Alice']
>>> ages = [23, 27, 36]
>>> dict(zip(names, ages))
{'Alice': 36, 'Bob': 23, 'Marie': 27}
0 请登录后投票
   发表时间: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中……
0 请登录后投票
   发表时间:2010-12-08  
盖茨他爹 写道
第一个用列表解析更高效

另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少

没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语
0 请登录后投票
   发表时间: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最慢
0 请登录后投票
   发表时间:2010-12-11   最后修改:2010-12-11
java程序员飘过,一直使用大众看得懂的所谓“劣化代码”中,而且以后还会继续用。
0 请登录后投票
   发表时间: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)
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics