1.切片:
可以对数组、元组、字符串进行切片操作得到想要那一部分元素
例:
# 创建一个0—99的数组
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> L[:10:2]
[0, 2, 4, 6, 8]
>>> (1,2,3,4,5)[:3]
(1, 2, 3)
>>> 'ASDFGH'[::2]
'ADG'
2.迭代
1.定义
我们可以使用for...in...来遍历list or tuple or dict or
字符串中的元素,这种方法称为迭代,任何可迭代对象都可以进行迭代操作
2.如何判断是否可迭代
可以使用collections模块中的Iterble
"""
警告:
from collections import Iterable
Warning (from warnings module):
File "__main__", line 1
DeprecationWarning: Using or importing the ABCs
from 'collections' instead of from 'collections.abc' is deprecated,
and in 3.8 it will stop working
"""
例如:
from collections import Iterable
isinstance([1,2,3,4],Iterable)
>>>True
isinstance('abc',Iterable)
>>>True
isinstance(1234,Iterable)
>>>False
L = [1,2,3,4,5,6]
for i in L:
print(i)
>>>1,2,3,4,5,6
对于一个字典迭代时默认迭代它的键:
例如:
dict = {"name":'wang',"age":18}
for key in dict:
print(key)
>>>name
age
如果想迭代它的值 dict.values
例如:
dict = {'name':'wang','age':18}
for val in dict.values():
print(val)
>>>'wang'
18
如果想迭代键值对 dict.itms()
例如:
dict = {'name':'wang','age':18}
for key,val in dict.items():
print(key,val)
>>> name wang
age 18
Python 内置的enumerate可以将list转变为索引—元素对
例如:
list = [1,2,3,4]
for key,val in enumerate(list):
print(key,val)
>>> 0 1
1 2
2 3
3 4
3.迭代器(Iterator)
迭代器协议:对象必须提供一个next方法,要么返回下一项,要么终止迭代抛出StopIteration异常
能够作用于for循环的对象统称为可迭代对象:Iterable,但是像list,str,file,dict等虽然可以作用于
for循环,但是它们没有next方法,是for循环先执行它们的__iter__()方法,使它们具有了__next__()方法
>>> l =[1,2,3]
>>> l.__next__()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
l.__next__()
AttributeError: 'list' object has no attribute '__next__'
>>> l = l.__iter__()
>>> l.__next__()
1
可以使用collections模块中的Iterble来判断一个对象是否使可迭代的
from collections import Iterable
print(isinstance({},Iterable))
>>>True
像生成器generator这样可以使用next()不断计算下一个元素的对象被称为:Iterator迭代器
要想将list,dict,str这样的对象转变为迭代器,可以使用iter()函数
from collections import Iterator
print(isinstance('asdf',Iterator))
>>>False
from collections import Iterator
print(isinstance(iter('asdf'),Iterator))
>>>True
4.列表生成式:
通过list(range(m,n))可以生成一个m到n-1的数组
(1)要生成[x1*2,x2*2,x3*2....xn*2]的数组
[x*2 for x in list(range(m,n))]
(2)在上面的例子中还可以添加if语句来筛选数据:
[x*2 for x in list(rangem,n) if x%2 == 0] # 选择列表生成器中为偶数的数做乘2运算
(3)还可以对字典中的键值对生成列表
例:
>>> dict = {'a':18,'b':19,'c':20}
>>> [k + '=' + str(v) for k,v in dict.items()]
['a=18', 'b=19', 'c=20']
(4)还可以对列表中的元素使用方法,例如将列表元素中的所有大写字母替换成小写字母
>>> L = ['Hello','World','IBM','Aplee']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'aplee']
5.生成器(generator)
三元表达式 :
b = a if a == "abc" else "cba" 如果a == "abc"成立,b = “abc”,否则b = “cba”
列表解析:
>>> l = ['鸡蛋%s' %i for i in range(10)]
>>> l
['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
使用列表生成器可是快速生成一个列表,但是列表中的元素肯定是有限的,如果我们只是用前几个元素那么
后面的元素就会浪费存储空间,此时我们就可以使用生成器(generator),它是将列表生成器的[]换成()
其中的元素是你每次调用它时生成的,这样就能节省存储空间
例如:
>>> f = (x for x in list(range(1,11)))
>>> next(f)
1
>>> next(f)
2
>>> for s in f:
print(s)
3
4
...
上面的例子使生成器的写法之一,当要计算的元素使用列表生成器无法计算时,例如
打印斐波拉契数列1,1,2,3,5,8,13....用列表生成器无法打印但是用一个函数
可以轻易的打印出来
def fib(max):
"""打印斐波拉契数列"""
n,a,b = 0,0,1
while n<max:
print(b)
a,b = b,a+b
n+=1
return 'done'
>>> fib(6)
1
1
2
3
5
8
'done'
我们将上面函数中的print换成yield这个函数就变成了一个generator
def fib(max):
"""generator打印斐波拉契数列"""
n,a,b = 0,0,1
while n<max:
yield b
a,b = b,a+b
n+=1
return 'done'
>>> fib(5)
<generator object fib at 0x000001DD86E77750>
>>> f = fib(5)
>>> next(f)
1
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> next(f)
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
next(f)
StopIteration: done
除第一次外每次调用这个函数都是从上次调用的yield语句之后开始执行
上面这个generator我们发现最后无法捕获return的值,next到最后一个元素之后会产生一个StopIteration
错误,我们捕获这个错误,最后return的就存在这个错误中:
>>> while True:
try:
print(next(l))
except StopIteration as e:
print('Generator return val = ',e.value)
break
1
1
2
3
Generator return val = done