Python高级特性:切片;迭代;列表生成式;生成器;迭代器

切片

在Python中常见的操作是取一个list或tuple的一部分,比如一个list如下:

L = ["red","yellow","black","orange","white","green","blue"]

取前三个元素的操作,除了用循环,还可以用切片:

L[0:3]
#表示从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素

print(L[-2:])
#表示取倒数后两个

实例:

#定义从1到100的序列
L = list(range(100))
#取前十个,同时隔一个数取一个
print(L[:10:2]) 

迭代

一般程序语言的迭代使用for。Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。 
除了list这种有下标的数据类型,还有例如dict这样的无下标的,也可以使用for迭代。

d  = {"funny":1,"lucky":2,"daddy":3}
for key in  d:
    print(key)
#因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

同时value也可以迭代。

for values in d.values():
    print(values)

如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:

>>> from collections import Iterable
>>> isinstance("abc", Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

列表生成式(List Comprehensions)

python内置了功能强大的列表生成式。 
实例:

l = list(range(1,11))
print(l)

输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
实例:输出1-10 的平方

L = []
for x in range(1,11):
    L.append(x*x)

练习: 
L1 = [‘Hello’, ‘World’, 18, ‘Apple’, None] 
期待输出: [‘hello’, ‘world’, ‘apple’] 
code:

L1 = ["Hello", "World", 18, "Apple", None]
L2 = []
for x in L1:
    if isinstance(x,str):
        L2.append(x.lower())
print(L2)

生成器

在Python中,一边循环一边计算的机制,称为生成器:generator,即只计算出要使用的数,节省空间。 
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

L = [x * x for x in range(10)]
L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
g
<generator object <genexpr> at 0x1022ef630>

打印generator:

g = (x*x for x in range(10))
for x in g:
    print(x)

练习

杨辉三角定义如下: 

1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
把每一行看做一个list,试写一个generator,不断输出下一行的list.

def triangles():
    L = [1]
    while True:
        yield L
        L1 = L[:]
        L = []
        i = 0
        while i < len(L1) - 1:
            L.append(L1[i] + L1[i+1])
            i = i + 1
        L.insert(0, 1)
        L.append(1)
n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break
文章导航