1 . 取一个list或tuple的部分元素,如:
L=['M','S','T','B','J']
[L[0],L[1],L[2]] #a.笨办法
r=[]
n=3
for i in range(n):
r.append(L[i]) #b.循环方法
L[0:3] #c.切片法
L[-1] #取倒数第一个元素
L[-2:] #取倒数第二个和倒数第一个元素
利用切片操作,实现实现一个trim()函数,去除字符串首尾的空格:
def trim(s)
if s[0] != ' ' and s[-1] !=' '
return s
elif s[0] == ' '
return s[1:]
elif s[-1] == ' '
return s[:-1]
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
Python中,迭代是通过for … in来完成的
如:
d={'a',:1'b':2,'c':3}
for key in d:
print(key)
for value in d.values():
print(value)
for k,v in d.items():
print(value)
for ch in 'ABC'
print(ch)
通过collections模块的Iterable类型判断
from collections import Iterable
isinstance('abc',Iterable)
使用enumerate函数,可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
for i,value in enumerate(['A','B','C']):
print(i,value)
>>> for x,y in[(4,5),(2,3),(1,1)]:
print(x,y)
4 5
2 3
1 1
请使用迭代查找一个list中最小和最大值,并返回一个tuple:
def findMinAndMax(L):
if len(L)!=0:
min=99999999
max=-99999999
for i in L:
if imax:
max=i
return min,max
else:
return(None,None)
- 任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。
list(range(1,11))
生成list[1,2,3,4,5,6,7,8,9,10]L=[]
for x in range(1,11):
L.append(x*x)
或
[x*x for x in range(1,11)]
#列表生成式
把要生成的元素x * x放到前面,后面跟for循环
加判断
[x*x for x in range(1,11) if x % 2 == 0]
两层循环,生成全排列
[m+n for m in 'ABC' for n in 'XYZ']
可以通过一行代码实现
import os #导入os模块
[d for d in os.listdir('.')] #os.listdir可以列出文件和目录
d = {'x':'A','y':'B','z':'C' }
[k + '=' + v for k , v in d.items()]
用法:
[x if x % 2 == 0 else -x for x range(1,11)]
=>[x if … else for x in …]
L=['Hello','World',18,'Apple',None]
[x.lower() if isinstance(x,str) else x for x in L]
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
生成器:一边循环一边计算,generator
方法一:
g = (x * x for x in range(10)) #创建generator
2.循环实现
g = (x * x for x in range(10)) #创建generator
for n in g:
print(n)
普通写法
def fib(max):
n,a,b,0,0,1
while n
def fib(max):
n,a,b=0,0,1
while n
把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:
for n in fib(6):
print(n)
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
g = fib(6)
>>> while True:
... try:
... x = next(g)
... print('g:', x)
... except StopIteration as e:
... print('Generator return value:', e.value)
... break
method1
def triangles()
f=[]
while True:
f=[f[i-1]+f[i] if i!=0 and i!=len(f) else 1 for i in range(len(f)+1)]
yield f
method2
def triangles()
a=[1]
while True:
yield a
a.append(0)
a=[a[i-1]+a[i] for i in range(len(a))]
##调用
n=0
for t in triangles():
print(t)
n=n=+1
if n==10:
break
result:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
可以直接作用于for循环的数据类型有以下几种:
①集合数据类型,如list、tuple、dict、set、str等
②generator,包括生成器和带yield的generator function
from collections import Iterator
isinstance((x for x in range(10)), Iterator)
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
其中iter(‘abc’)就是把str转化为Iterator
from collections import Iterable
isinstance('abc',Iterable)
注意:
list、dict、str等数据类型不是Iterator:
原因:
for x in [1, 2, 3, 4, 5]:
pass
实际上完全等价于:
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break