学习资源:廖雪峰Python教程
重点记录与c,java有区别的知识点,红色部分重点注意。
三、高级特性
1.切片(Slice)
取list或tuple前n个数,也就是索引 0至(n-1) 的元素,或者取后n个数,也就是索引 (L-n)至(L-1) 或
-1至-n,L为list或tuple的长度,tuple类似:
②通过collections模块的Iterable类型判断一个对象是不是可迭代对象
L = list(range(100)) #创建一个0-99的list
print(L[0 : 3]) #从索引0开始取,直到索引3为止,但不包括索引3,即0,1,2
print(L[ : 3]) #如果第一个索引是0,可以省略
print(L[1 : 3]) #取索引1至索引3的元素,即1,2
print(L[-2 : -1]) #从索引-2开始取,直到索引-1为止,且包括索引-2,即98,99
print(L[-2 : ]) #类似的,索引-1可以省略
print(L[-5 : -2]) #从索引-5开始取,直到索引-2为止,且包括索引-5,即95,96,97,98
print(L[ : 10 : 2]) #索引0到索引10,但不包括索引10的元素,每两个取一个,即0,2,4,6,8
print(L[ : : 5]) #所有的元素,每五个取一个,即0,5,10,15...
print(L[ : ]) #原样赋值一个list
2.迭代( Iteration)
①通过for...in循环来遍历list,tuple之类的
可迭代对象,这种遍历称为迭代(Iteration)
from collections import Iterable
print(isinstance(123, Iterable)) #整数是否可迭代?False
print(isinstance('abc', Iterable)) #str是否可迭代?True
print(isinstance([1, 2, 3], Iterable)) #list是否迭代?True
print(isinstance((1, 2, 3), Iterable)) #tuple是否可迭代?True
print(isinstance({'a' : 1, 'b' : 2, 'c':3}, Iterable)) #dict是否可迭代?True
print(isinstance(set([1, 2, 3]), Iterable)) #set是否可迭代?True
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
3.列表生成式(List Comprehentions)
①列表生成式(List Comprehensions)是Python内置的非常简单却强大的可以用来创建list的生成式
L1 = list(range(0, 10)) #生成一个0-9的list
L2 = [x * x for x in range (0, 10)] #生成list[0, 1, 4, 9, ..., 81]
L3 = [x * x for x in range (0, 10) if x % 2 == 0] #筛选出仅偶数的平方生成list[4, 16, 36, 64]
L4 = [m + n for m in 'abc' for n in 'xyz'] #两层循环生成全排列['ax','ay', ... ,'cy', 'cz']
print(L1)
print(L2)
print(L3)
print(L4)
d = {'a' : 1, 'b' : 2,'c' : 3}
for k,v in d.items():
print(k, '=', v) #输出a=1 b=2 c=3
因此,列表生成式也
可以使用多个变量来生成list:
d = {'a' : 'A', 'b' : 'B', 'c' : 'C'}
L = [k + '=' + v for k, v in d.items()]
print(L) #输出['a=A', 'b=B', 'c=C']
4.生成器(generator)
①一遍循环一遍计算的机制。通过不断next(generator)获得元素
②创建一个generator的方法一:将列表生成式的
[] 号改成 () 号
L = [x * x for x in range(10)] #L是一个list
g = (x * x for x in range(10)) #g是一个generator
for n in g:
print(n) #generator可迭代
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b #相当于t = (b, a + b)
# a = t[0]
# b = t[1]
#t是一个tuple
n = n + 1
return 'done'
for n in fib(5): #这里的fib(5)就是一个generator对象
print(n)
在变成generator的函数中,
每次遇到yield都会返回,再次next()执行的时候,从上次的yield语句处继续执行。如上面fib函数中,对fib(5)进行迭代遍历是,每次遇到yield b就返回当前b的值,依次是1,1,2,3,5
④用for...in循环调用generator时,拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
⑤注意:对于函数改成的generator来说,遇到yield返回一个值,遇到return或者最后一行语句,整个指令结束
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b #相当于t = (b, a + b)
# a = t[0]
# b = t[1]
#t是一个tuple
n = n + 1
return 'done'
g = fib(5) #构建generator对象
while True:
try:
x = next(g) #依次向后遍历generator
print(x)
except StopIteration as e: #捕获函数的返回值
print('Generator return value', e.value)
break
调用函数时,获得的是函数的return:a = abs(-2)
调用函数改成的generator时,
获得的是一个generator对象:g = fib(5)
5.迭代器
①可以直接作用于for...in循环的数据类型有
集合数据类型:
str、tuple、dict、list、set等
generator:包括
生成器和
带yield的generator function
称为
可迭代对象:Iterable
可以使用isinstance()判断一个数据类型是否是Iterable对象
from collections import Iterable
print(isinstance(123, Iterable)) #整数是否可迭代?False
print(isinstance('abc', Iterable)) #str是否可迭代?True
print(isinstance([1, 2, 3], Iterable)) #list是否迭代?True
print(isinstance((1, 2, 3), Iterable)) #tuple是否可迭代?True
print(isinstance({'a' : 1, 'b' : 2, 'c':3}, Iterable)) #dict是否可迭代?True
print(isinstance(set([1, 2, 3]), Iterable)) #set是否可迭代?True
可以用isinstance()判断一个对象是否是Iterator对象:
from collections import Iterator
print(isinstance((x for x in range(10)), Iterator)) #生成器是不是Iterator对象?True
print(isinstance([], Iterator)) #list是不是Iterator对象?False
print(isinstance({}, Iterator)) #dict是不是Iterator对象?False
print(isinstance('abc', Iterator)) #str是不是Iterator对象?False
生成器都是iterator对象,list、dict、str等虽然是iterable,但不是iterator
③把list、dict、str等Iterable变成iterator可以用iter()函数:
from collections import Iterator
print(isinstance(iter([]), Iterator)) #将list转化为iterator,Ture
print(isinstance(iter('abc'), Iterator)) #将str转化为iterator,Ture