从Java转到Python,阅读源码的时候发现了一些有趣的小用法,在这里总结一下。
代码为:
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]
,得到同样的结果。
如果将[]改为(),结果发生了变化:
object at 0x7f96095b1780> <type 'generator'>
生成的不再是list,也不是元祖,而是一个generator。
在java里比较不爽的是比较基本都是二元操作,像1<=a<=5
这样的操作只能写成两个式子,而在python里可以直接连接着写。
a=2
print 1<a<5 #结果为True
Python里对任意对象都可以直接判断其是否为真
类型 | True | False |
---|---|---|
字符串 | 非空 | 空字符串'' |
数字 | 非0 | 数字0 |
容器 | 非空 | 空容器() [] {} |
其它 | 任意非False | None |
字典的get(key, value)
方法可以指定默认值,如果不存在该key,则返回默认值value。这在用来统计key出现的数量时很有用。
大部分语言中,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函数在遍历的时候同时返回索引和值,而且还可以指定索引的起始位置。
list1 = [1, 2, 3, 4, 5, 6, 7 ]
for i, e in enumerate(list1, 1):
print i, e
表示从第二个元素开始遍历,其中i为索引,e为值。
写函数时会遇到属性问题,比如说一个人的名字、年龄、地址等,可以存成几个字典,也可以单独存成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过程中被忽略掉的多余的数据丢失了,在实现时需要注意。平时这个功能应该蛮好用。