您的位置:首页 > 编程语言 > Python开发

Python的魅力(Pythonic)及各种“不为人知”的小技巧

2014-07-08 09:45 417 查看
写这篇Blog的目的是记录学习Pythonic中遇到某些提问缩,以及回答某些提问,力图做到Pythonic!!!【如果您认为有更简洁的代码,更一目了然的代码,更Pythonic的代码,一定记得交流探讨下。谢谢,也不枉我的抛砖引玉。3Q】

1、Python: Built-in Functions妙用

一个小例子,出自于某某XX问的作业题:

请问,这个题目怎么做?

a=[[1,2], [3,4], [5,6], [7,8], [9,0]]
b=[8,7,9,7,9]
其中,
b[0]=8 对应着 a[0]=[1,2]
b[1]=7 对应着 a[0]=[3,4]
b[2]=9 对应着 a[0]=[5,6]
b[3]=7 对应着 a[0]=[7,8]
b[4]=9 对应着 a[0]=[9,0]
把 b 从小到大排序,变成b=[7,7,8,9,9],现在希望原来的b的成员与a的成员之间的对应关系能够保留,也就是同时把a变成
a=[[3,4], [7,8], [1,2], [5,6], [9,0]] ,或者
a=[[7,8], [3,4], [1,2], [5,6], [9,0]] ,或者
a=[[3,4], [7,8], [1,2], [9,0], [5,6]] ,或者
a=[[7,8], [3,4], [1,2], [9,0], [5,6]],
这四个解答里面任何一个都可以。

请问,用最简洁的python语句怎样编写这个小程序???


我的答案如下:

>>> a = [[1,2], [3,4], [5,6], [7,8], [9,0]]
>>> b = [8,7,9,7,9]
>>> c = zip(b,a)
>>> c
[(8, [1, 2]), (7, [3, 4]), (9, [5, 6]), (7, [7, 8]), (9, [9, 0])]
>>> d = sorted(c, cmp=lambda x,y:cmp(x[0],y[0]))
>>> d
[(7, [3, 4]), (7, [7, 8]), (8, [1, 2]), (9, [5, 6]), (9, [9, 0])]
>>> print [i[1] for i in d]
[[3, 4], [7, 8], [1, 2], [5, 6], [9, 0]]
>>>

【更新于2014.07.23:实测使用key更快!】

2、测试运行时间和内部执行

使用timeit模块查看运行时间以及使用dis模块查看字节码

我们用sorted()和.sort()函数了来测试一个简短小程序

>>> a = [4, 2, 1, 5 , 3]
>>> import timeit
>>> A = lambda: sorted(a)
>>> B = lambda: a.sort()
>>> # 想想以下为什么这样的顺序执行
>>> timeit.Timer(A).timeit()
0.407991886138916
>>> timeit.Timer(B).timeit()
0.18276619911193848
>>> a
[1, 2, 3, 4, 5]
>>> a = [4, 2, 1, 5 , 3]
>>> a
[4, 2, 1, 5, 3]
>>> import dis
>>> dis.dis(A)
1           0 LOAD_GLOBAL              0 (sorted)
3 LOAD_GLOBAL              1 (a)
6 CALL_FUNCTION            1
9 RETURN_VALUE
>>> dis.dis(B)
1           0 LOAD_GLOBAL              0 (a)
3 LOAD_ATTR                1 (sort)
6 CALL_FUNCTION            0
9 RETURN_VALUE
>>>
这段代码测试表明:如果不需求特殊的排序方式或者不需要返回一个全新的序列,那么 .sort()性能更优(实际上是废话,一个操作原始数据,一个还要复制一份)。所以,需要优化时候,测试吧!例如直接赋值

a, b = b, a

3、循环中动态产生变量

出自于QQ群某学生提问【2014.07.23】

>>> for i in xrange(5):
exec 'a'+str(i)+' = '+str(i)+''

>>> a0
0
>>> a1
1
>>> a2
2


一直在学习,so更新不断。

本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创。还有未涉及的,会不定期更新,有错误请指正。

如果你看到这篇博文时发现不完整,那是我为防止爬虫先发布一半的原因,请看原作者Blog。

如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python Pythonic 魅力