Python学习(三)—— 高级特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1449516487/article/details/86498433

一、切片

Python提供了一种方便的机制来切割list、tuple、str等对象中的元素:

>>> L = [1,2,3,4,5,6,7,8,9,10]
>>> L[0:3]             #取前三个数
[1, 2, 3]
>>> L[-2:-1]           #取到数两个数
[9, 10]
>>> L[::2]             #每隔两个数取一个
[1, 3, 5, 7, 9]
>>>
>>> 'ABCDEFG'[:3]      #取前三个字符
'ABC'
>>> 'ABCDEFG'[::2]     #每隔两个字符取一个
'ACEG'

二、迭代

1.迭代dict

>>> d = {'a':1, 'b':2, 'c':3}
>>> for key in d:    #dict不是安装list的方式顺序排序,所以迭代的结果顺序可能不同
...    print(key)
...
a
c
b
>>> for value in d.values():    #迭代dict的values
...    print(key)
...
1
3
2
>>> for k,v in d.items():       #同时迭代key和value
...    print(k,v)
...
a 1
c 3
b 2 

2.迭代str

>>> for ch in 'ABC':
...    print(ch)
...
A
B
C

3.判断迭代对象

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

4.把list编程索引-元素对

>>> for i,value in enumerate(['A', 'B', 'C']):
...    print(i, value)
...
0 A
1 B
2 C

4.引用两个变量

>>> for x,y in [(1,1), (2,4), (3,9)]:
...    print(x,y)
...
1 1
2 4
3 9

三、列表生成式

列表生成式即List Comprehensions,是Python内置的可以用来创建list的生成式。

举个例子,要生成[1*1, 2*2, 3*3, ..., 10*10]可以直接通过列表生成式生成:

>>> [x * x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

for循环后面还可以加上if判断,从而筛选出仅偶数的平方:

>>> [x * x for x in range(1,11) if x % 2 == 0]
[4, 16, 36, 64, 100]

还可以使用两层循环,生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

四、生成器

通过列表生成式创建的列表受到内存限制,其容量肯定是有限的。如果创建一个包含100万个元素的列表,而我们只使用了其中的前几个元素,这就会造成空间的浪费。Python提供了一种循环推算的机制来获得元素,这样就不必创建完整的list,从而节省大量的空间——这种机制称为生成器:generator

生成器的创建有两种方法:

(1)第一种方法:与列表生成式的区别在于[ ]改为( ),通过for循环调用

>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
>>>
>>> for n in g:
...    print(n)
...
0
1
4
9
16
25
36
49
64
81

(2)第二种方法:yield关键字

普通函数 generator

def fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        print(b)

        a, b = b, a + b

        n = n + 1

    return 'done'

def fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        yield b

        a, b = b, a + b

        n = n + 1

    return 'done'

generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行语句就返回。而变成gennerator的函数,在每次调用next()的时候执行, 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。实例如下:

>>> def odd():
...    print('step 1')
...    yield 1
...    print('step 2')
...    yield 3
...    print('step 3')
...    yield 5
...
>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:

>>> for n in fib(6):
...    print(n)
...
1
1
2
3
5
8

五、迭代器

1.可迭代对象(两类):可以直接作用于for循环

类型 对象
集合数据类型 list、tuple、dict、set、str等
generator 包括生成器和带yield的generator function

可以使用isinstance()判断一个对象是否是Iterable对象:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

2.迭代器:不仅可以作用于for循环,还可以被next()函数不断调用并返回下一个值

可以使用isinstance()判断一个对象是否是Iterator对象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

把list、dict、str等Iterable可迭代对象变成Iterator迭代器可以使用iter()函数:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

猜你喜欢

转载自blog.csdn.net/q1449516487/article/details/86498433