切片( Slice)[:]
何为切片?从list或者tuple,dict等中取一段数据的操作。
比如,从list中取第2-5个元素,按照之前的做法,只能采用[L[1],L[2],L[3],L[4]]
不仅麻烦而且当数据特别多的时候,只能采用循环来做。
使用切片若需要取2-5个元素,则可以:L[1:5]
获取的就是第2-第5个元素。
当从索引0开始时,0可以省略,也就是[:n]
取第0到第n个元素
同样支持倒数的切片,若取最后三个数据,则L[-3:]
支持按一定间隔选取数据,比如:L[::2]
将所有数据每两个取一次元素
支持切片的数据结构:list,tuple,字符串
实例:
利用切片操作,去除字符串首尾的空格
def a(s):
while s[0]==' ':
s=s[1:]
while s[-1]==' ':
s=s[:-1]
return s
代码运行结果如下:
这是对字符串的切片。
迭代(lteration)
何为迭代?其实就是一种遍历,使用for...in
来实现。
1. 对list和tuple的迭代:
def a(L):
sum=0
for n in L:
sum=sum+n
return sum
以上代码是1+2+3+...
的运算,L可以是list,tuple,执行结果如下:
2. 对字符串的迭代:
#函数功能是取出字符串中最大字母值
def max(L):
max='a'
for n in L:
if max<n:
max=n
return max
执行结果如下:
3. 对dict的迭代
对dict的迭代,默认是对key
的迭代,如果要迭代value
,可用for value in L.values()
,如果要同时迭代key
和value
,可用for k,v in L.items()
实例如下:
def score(L):
for num in L:
print(num)
return None
代码执行结果如下:
可以看出,默认的迭代是对key
进行迭代。
def score(L):
for num in L.values():#对value的迭代
print(num)
for num,v in L.items():#对key和value的迭代
print(num,v)
return None
执行结果如下:
那么,如何判断一个对象是否能迭代呢,用内置的collections
模块的iterable
类型判断
所以整数是不可以迭代的
列表生成式
作用:以最简便的方法生成想要的list。
例如:要生成一个[1*1,2*2,....100*100]
的列表,我们可以用循环来实现,带式太麻烦,所以用列表生成式来生成,比如[x*x for x in range(100)]
,实现如下:
列表生成式还可以添加if判断,比如要求删选出能被2整除的数。
[x*x for x in range(100) if x%2==0]
也可以使用两层循环
[m+n for m in 'ABC' for n in 'XYZ']
输出为:
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器(generator)
作用:当需要生成一个特别大的列表,或者列表按照一定算法生成时,我们不需要列出所有满足条件的元素,可以用生成器。
特点:保存在内存中的不再是一个个的元素,而是算法,所以节省内存空间。
方法1:直接将列表生成器的[]
改为()
即可,如下:
L=(x*x for x in range(100))
以上代码生成的就是一个generator。
方法2:使用yield
比如:生成斐波拉契数列
def fib(n):
a=0
b=1
t=0
for m in range(n):
t=a
a=b
print('执行')
yield(b)
b=b+t
print('相加')
return 'done'
执行结果如下:
由图中可以看出,当第一次执行next
函数时,执行到yidld
则结束执行,当再次运行next
时,从yield
开始执行,到yield
执行再次结束。
综上,每次调用next()
时 遇到yield
语句则返回,再次执行从上次返回的yield
语句继续执行
如何获取列表返回值:
1. 使用next()
函数 ,如上
2. 使用for循环:
从上图运行结果可以看出,无论如何都打印不出generator
的返回值error
3.使用while
可以打印 generator
的返回值
def fib(n):#生成器,生成斐波拉契数列
a=0
b=1
t=0
for m in range(n):
t=a
a=b
#print('执行')
yield(b)
b=b+t
#print('相加')
return 'error'
def a(n):#调用生成器,打印n个元素
b=fib(n)
while True:
try:
x=next(b)
print(x)
except StopIteration as e:
print('Generator return value:',e.value)
break
return 'finish'
图中可以看出,若要拿到返回值,必须捕获StopIteration
错误,返回值包含在StopIteration
的 value
中。
迭代器
可以被next()
函数调用并不断返回下一个值的对象成为迭代器:Iterator
**可迭代对象Iterable
:
从以上可以看出,list,tuple,dict,set,str等都可以使用for
来迭代,generator
也可以,所以其都是可迭代对象Iterable
可以使用isinstance()
来判断一个对象是不是Iterable
对象。要首先添加from collections import Iterable
这一行 **
生成器不仅可以作用于for
循环,还可以用next()
不断调用返回下一个值,直到最后抛出StopIteration
错误 。
**生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数:**