Python 高级特性

切片

Python 对字符串或者是集合的操作非常的灵活且简洁。

集合或者字符串后面加一个 [a:b:c]

a 表示起始位
b 表示截止位
c 表示逢 c 个元素取一

直接看代码:

1
2
3
4
5
listtt = ['a','b','c','d','e']
print listtt[:2]
print listtt[:]
print listtt[1::]
print listtt[::2]

结果是:

1
2
3
4
['a', 'b']
['a', 'b', 'c', 'd', 'e']
['b', 'c', 'd', 'e']
['a', 'c', 'e']

其中直接一个冒号就是复制原集合,别的都能好理解,很简洁。

对于字符串也是一个道理:

1
2
print 'abcdefg'[::2]
print 'abcd'[:2:]

结果就不写了,和集合一样的。

对了,还可以倒着取值,记住倒数第一个的索引是 -1 就行,看个例子就懂了:

1
2
listtt = ['a','b','c','d','e']
print listtt[-5:-1]

结果是 ['a', 'b', 'c', 'd']

注意一点,不论是正数还是倒数,起始位都要比截止位小,否则结果都是空的集合。

列表生成

我们知道有个 rang() 函数可以用来快速的生成集合。

现在我们需要生成一些有一定约束的集合,例如,0 到 100 的三方组成的集合。

1
2
>>> [x * x * x for x in range(0,10)]
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]

前面写个函数,后面加个循环就好了。

还可以在后面加个判断条件:

1
2
>>> [x*x*x for x in range(0,10) if x%3==0]
[0, 27, 216, 729]

还有种,多重循环,两两交互的:

1
2
3
python
>>> [x * y for x in [1,2,3] for y in [4,5,6]]
[4, 5, 6, 8, 10, 12, 12, 15, 18]

代码都非常的简洁,但是格式千万不能错!

生成器

generator , 这不就是 ES 6 中提供的一种异步编程解决方案么。果然语言思想都是互通的,相互学习的啊。

创建一个 generator 的一种简单方式就是:

1
2
3
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x107c27eb0>

和列表生成有所不同的就是,它是小括号。

原理结构方面和 JS 的差不多。

都是可以通过 next() 方法一个接一个的迭代,或者是通过 for 循环直接遍历。

其中 yield 关键字也是和 JS 中的一样(类似于 return,但是会记录上次的循环层数)。

有点神奇 = = 。


慢慢的感受到了 Python 的简洁和强大。