Pythonic的一些用法

从Java转到Python,阅读源码的时候发现了一些有趣的小用法,在这里总结一下。

for和if的简化

代码为:

list1 = [1, 2, 3, 4, 5, 6, 7 ]

rs = ([r if r%2==0 else r+10 for r in list2])
print rs

执行结果为:

[11, 2, 13, 4, 15, 6, 17]

代码里对for和if进行了简化,并对if进行后置

这里的for语句中的括号可以多玩一下,单独提出来吧

list1 = [1, 2, 3, 4, 5, 6, 7 ]
rs = ([r for r in list1])
print rs, type(rs)

运行结果为:

[1, 2, 3, 4, 5, 6, 7] <type 'list'>

如果去掉最外层的(),改为rs = [r for r in list1],得到同样的结果。
如果将[]改为(),结果发生了变化:

<generator object <genexpr> at 0x7f96095b1780> <type 'generator'>

生成的不再是list,也不是元祖,而是一个generator。

链式比较

在java里比较不爽的是比较基本都是二元操作,像1<=a<=5这样的操作只能写成两个式子,而在python里可以直接连接着写。

a=2
print 1<a<5 #结果为True

关于真值

Python里对任意对象都可以直接判断其是否为真

类型TrueFalse
字符串非空空字符串''
数字非0数字0
容器非空空容器() [] {}
其它任意非FalseNone

字典默认值

字典的get(key, value)方法可以指定默认值,如果不存在该key,则返回默认值value。这在用来统计key出现的数量时很有用。

循环和异常中的else

大部分语言中,else都只和if一起出现,而在python中,else还可以和for、while一起出现,用来判定是否退出循环。
例如:

for x in xrange(1,5):
    if x == 3:
        print 'yes, it's 3!'
        break
else:
    print 'sorry, no 3!'

如果在Java里,最后一句print需要额外的一个判断变量和if语句。
而在python中,else 中的语句会在循环正常执行完(即不是通过 break 跳出而中断)的情况下执行,while … else 也一样。

此外,else还会出现在try/except/else中,如果没有发生异常,则会执行else之后的代码。

enumerate函数

enumerate函数在遍历的时候同时返回索引和值,而且还可以指定索引的起始位置。

list1 = [1, 2, 3, 4, 5, 6, 7 ]
for i, e in enumerate(list1, 1):
    print i, e

表示从第二个元素开始遍历,其中i为索引,e为值。

zip函数

写函数时会遇到属性问题,比如说一个人的名字、年龄、地址等,可以存成几个字典,也可以单独存成list,然后使用zip函数打包。
zip函数的作用是接受一系列可迭代对象,并将其中的元素打包为元组(tuple),然后返回由这些元组构成的列表(list)。如果说这些对象长度不等,那么返回的列表长度与最短的对象的长度相同。
例如:

list1 = [1, 2, 3, 4, 5, 6, 7 ]
list2 = ['a', 'b', 'c', 'd']
list3 = ['a2', 'b2', 'c2', 'd2', 'e2']
print zip(list1, list2)
print zip(list1, list2, list3)

输出为

[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
[(1, 'a', 'a2'), (2, 'b', 'b2'), (3, 'c', 'c2'), (4, 'd', 'd2')]

zip()还可以配合*实现逆操作

rs = zip(list1, list2, list3)
rs
print zip(*rs)

输出为:

[(1, 'a', 'a2'), (2, 'b', 'b2'), (3, 'c', 'c2'), (4, 'd', 'd2')]
[(1, 2, 3, 4), ('a', 'b', 'c', 'd'), ('a2', 'b2', 'c2', 'd2')]

可见虽然实现了拆分,但是并不能得到原始的数据,在zip过程中被忽略掉的多余的数据丢失了,在实现时需要注意。平时这个功能应该蛮好用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值