学习目标:
Python学习七、
python高级特性
学习内容:
1、分片
2、迭代
3、列表生成式
4、生成器
5、迭代器
1、分片
- 取一个list或tuple的部分元素
用循环取一部分
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
r = []
n = 3
for i in range(3):
r.append(L[i])
print(r)
输出:
['Michael', 'Sarah', 'Tracy']
1、用循环就比较繁琐了,现在用分片来实现取列表一部分
分别取前三个名字,当索引从0开始时,可以省略,然后从倒数第二个开始去取到最后一个
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(L[0:3])
print(L[:3])
print(L[-2:])
输出:
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Bob', 'Jack']
还有每5个取一个
p = []
n = 1
while n<= 100:
p.append(n)
n+=1
print(p[::5])
print(p[:10:2])
输出:
[1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76, 81, 86, 91, 96]
[1, 3, 5, 7, 9]
2、字符串也可以分片取
a = 'ABCDEFG'
print(a[:3])
print(a[:5:2])
print(a[1:3])
输出:
ABC
ACE
BC
2、迭代
- 给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代
1、只要是可迭代对象,无论有无下标,都可以迭代,比如:dict
迭代key
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
输出:
a
c
b
迭代value
d = {'a': 1, 'b': 2, 'c': 3}
for value in d.value():
print(value)
输出:
1
2
3
2、判断一个对象是否可以被迭代
from collections import Iterable
isinstance('abc', Iterable)
isinstance(123, Iterable)
输出:
True
False
3、Python内置的enumerate函数可以把一个list变成索引-元素对,可以在for循环中同时迭代索引和元素本身
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
输出:
0 A
1 B
2 C
3、列表生成式
- 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式
1、一般的列表生成式
list(range(x, y))
print(list(range(1, 11)))
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
或者
s = 'aasadaDS'
s = [x for x in s]
print(s)
输出:
['a', 'a', 's', 'a', 'd', 'a', 'D', 'S']
2、如果要生成一定的格式
例如:xx+yy…
l = []
for i in range(1,11):
l.append(i*i)
print(l)
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
3、循环的列表生成式太过复杂,可以用更简单的语句
[i for i in range(x, y)]
print([i for i in range(1,11)])
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
4、在[i for i in range(x, y)]后面和可以加上条件
[i for i in range(x, y) 条件]
print([i for i in range(1,11) if i%2==0])
输出:
[2, 4, 6, 8, 10]
5、生成式还可以用多层循环
[m + n for m in ‘*’ for n in ‘*’]
print([i*j for i in range(1,5) for j in range(1,5)])
输出:
[1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]
6、for可以迭代两个或者多个变量
例如dict.items
d = {'x': 'A', 'y': 'B', 'z': 'C' }
for k, y in d.items():
print(k, '=', y)
输出:
x = A
y = B
z = C
7、把一个list中所有的字符串变成小写
L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
输出:
['hello', 'world', 'ibm', 'apple']
8、if…else…也可以用来生成列表,if写在for前面必须加else
if…else…for…:因为
print([x if x % 2 == 0 else -x for x in range(1, 11)])
输出:
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
- for前面的if … else是表达式,而for后面的if是过滤条件,不能带else
- for前面的部分是一个表达式,它必须根据x计算出一个结果,当存在if时,必须有else否则无法计算出结果
4、生成器—generator
- 生成器不同于列表生成式,列表生成式是直接通过一个规则不管多大都会生成一个列表,而生成器是编写一个规则,generator保存的是算法,可以根据这种规则列出想要的结果,生成器可迭代
1、列表生成式与生成器的对比
普通列表生成式
l = [x*x for x in range(11)]
print(l)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
生成器
l = (x*x for x in range(11))
print(l)
输出:
<generator object <genexpr> at 0x000001BB131FC820>
2、如果想要输出生成器的元素需要用到next()函数
next()
l = (x*x for x in range(11))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
输出:
0
1
4
9
16
25
36
49
64
81
100
可以用for循环来输出生成器
l = (x*x for x in range(11))
p = []
for i in l:
if i not in p:
p.append(i)
print(p)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
3、一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
yield
def fid(max):
a, b, n = 0, 1, 0
while n < max:
yield b
a, b = b, a+b
n = n+1
return 'done'
l = []
for i in fid(6):
if i not in l:
l.append(i)
print(l)
输出:
[1, 2, 3, 5, 8]
4、想要捕获到最后的那个return
try…except…
def fid(max):
a, b, n = 0, 1, 0
while n < max:
yield b
a, b = b, a+b
n = n+1
return 'done'
o = fid(6)
while True:
try:
i = next(o)
print('o:', i)
except StopIteration as e:
print('Generator return value:', e.value)
break
输出:
o: 1
o: 1
o: 2
o: 3
o: 5
o: 8
Generator return value: done
5、迭代器
isinstance()函数: isinstance(变量,数据类型)
- 可以直接作用于for循环的对象统称为可迭代对象:Iterable
- 可以使用isinstance()判断一个对象是否是Iterable对象
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
- 可以使用isinstance()判断一个对象是否是Iterator对象
- Iterator的计算是惰性的,Iterator甚至可以表示一个无限大的数据流