Python高级特性:切片;迭代;列表生成式;生成器;迭代器
最后更新于:2022-04-01 07:27:46
#### 切片
在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
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
~~~