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

写这篇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。

如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值