3.1. 高级特性

3.1.1. 切片

# 生成一个list
In [13]: arr=list(range(1,10))

In [14]: arr
Out[14]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 获取第1个元素
In [15]: arr[0]
Out[15]: 1

# 获取最后一个元素
In [16]: arr[-1]
Out[16]: 9

# 获取最后2个元素
In [17]: arr[-2:]
Out[17]: [8, 9]

# 获取倒数第二个元素
In [18]: arr[-2:-1]
Out[18]: [8]

# 隔一个获取元素
In [19]: arr[::2]
Out[19]: [1, 3, 5, 7, 9]

# 获取偶数位
In [20]: arr[1::2]
Out[20]: [2, 4, 6, 8]

# 特定范围的
In [21]: arr[2:4]
Out[21]: [3, 4]

# 复制
In [22]: arr[:]
Out[22]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

3.1.2. 是否可以迭代判定

In [23]: from collections.abc import Iterable

In [24]: isinstance("abc",Iterable)
Out[24]: True

In [25]: isinstance("[1,2]",Iterable)
Out[25]: True

In [26]: isinstance(1,Iterable)
Out[26]: False

3.1.3. 常见类型的遍历方法

arr=[1,2,3]
for i in arr:
   print(i)

for index,i in enumerate(arr):
   print(index,i)

kw = {"name": "zhaojiedi","age":10}

for k,v in kw.items():
   print(k,v)

for k in kw:
   print(k,kw[k])

for v in kw.values():
   print(v)

3.1.4. 列表生成式

In [33]: arr=list(range(1,10))

In [34]: arr
Out[34]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [35]: [x for x in range(1,10)]
Out[35]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [36]: [x for x in range(1,10) if x%2==0]
Out[36]: [2, 4, 6, 8]

In [37]: [x if x%2==0 else -x for x in range(1,10) ]
Out[37]: [-1, 2, -3, 4, -5, 6, -7, 8, -9]

In [38]: [x*2 for x in range(1,10) ]
Out[38]: [2, 4, 6, 8, 10, 12, 14, 16, 18]

In [39]: [m+n for m in "ABC" for n in "XYZ" ]
Out[39]: ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

3.1.5. 生成器

列表生成式数据都会在内存, 特定场景下不合适, 期望使用到的时候计算出值,就需要生成器。

# 列表的,直接产出值了
In [40]: [x for x in range(1,10)]
Out[40]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 生成器的
In [41]: a = (x for x in range(1,10))
Out[41]: <generator object <genexpr> at 0x1062064d0>

In [43]: next(a)
Out[43]: 1

In [44]: next(a)
Out[44]: 2

In [45]: for i in a:
 ...:     print(i)

3.1.6. 自己定义一个生成器函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def my_range(start,end):
    if start >=end:
        raise Exception("start >=end ")
    for i in range(start,end):
        yield i 

print(my_range(1,10))

for i in my_range(1,10):
    print(i)

3.1.7. 迭代器

凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。