切片slice
取列表/元祖前3个元素:列表取出为列表,元祖取出为元祖
L[0:3]
表示从索引 0 到 3(第1
个到第3个元素),但不包括 3的元素
L[:]
表全部,可以省略,第一个省开头0,第二个省结尾len(L)+1
L[2:3]
表示 L[2]
L[10:20]
第 11
到 20 个数
L[:1]
第一个数; L[1:]
除第一个数剩下所有
L[-1:]
== L[len(L) - 1 : len(L) + 1]
最后一个数;
L[:-1]
除最后一个数所有的数
L[-10:]
最后10个数
L[:10:2]
前10个数每2个数取一个
L[::5]
每5个数取一个
字符串也可以
>>> a = 'abcdedf'
>>> a[::2]
'acef'
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
# ' h ', ' ', '',' h h '
def trim(s):
if len(s) == 0:
return s
while s[:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
return s
迭代iteration
可迭代类型皆可迭代,不止list列表,还有字典、元祖、集合、字符串
判断是否可迭代
from collections import Iterable
>>> isinstance(123,Iterable)
False
>>> isinstance(([1,2,3]),Iterable)
True
for n in L
== 对 L 遍历一遍
字典迭代
d = {'a':1,'c':3,'b':4}
for key in d: # 默认为关键字
print(key)
for value in d.values(): # 对值用 d.values()
print(value)
for k,v in d.items(): # 同时使用值和关键字 d.items()
print(k,v)
字符串迭代
for s in 'abcd':
print(s)
a
b
c
d
同时迭代 序号和元素
通过enumerate( )函数
for i,value in enumerate(['a','b','c']):
print(i,value)
0 a
1 b
2 c
同时引入多个变量
for x,y in [(1,1),(2,2),(3,3)]:
print(x,y)
1 1
2 2
3 3
列表生成器
语法:[ x+y for x in range(1,11) if x%2==0 for y in range(1,10) ]
使for
循环后得到的所有表达式
以列表形式存入
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [ x*x for x in range(1,11) if x%2 == 0 ]
[4, 16, 36, 64, 100]
>>> [n + m for n in 'abc' for m in 'ABC'] # 两层 for 全排列
['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']
>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
for循环可以同时使用两个变量: 字典d.items()
>>> d = {'a':'A','b':'B','c':'C'}
>>> [ x + '-->' + y for x,y in d.items()]
['a-->A', 'b-->B', 'c-->C']
使所有字符变小写
>>> L = ['J','Haa']
>>> [s.lower() for s in L]
['j', 'haa']
for前面使用if else
>>> [ 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
生成器generator
第一种定义 ( )
列表表达式直接生成完整的列表 | 占空间 | 使用[ ] |
---|---|---|
生成器根据算法生成,需要的时候生成 | 需要多少生成多少,减少空间开销 | 使用( ) |
g = (x*x for x in range(3))
for n in g:
print(n)
0
1
4
互换
>>> a = 1
>>> b = 10
>>> a,b = b, a # 直接换
>>> a
10
>>> b
1
>>> a,b = b, a+b # 右边值a,b为替换前的 a,b值
>>> a
1
>>> b
11
第二种定义替换函数中print
为 yield
def fib(max):
n, a, b = 0,0,1
while n < max:
yield b # 替换print
a,b = b,a+b
n += 1
f = fib(5) # 此时 f 为生成器 而非函数
print(f)
for n in f: # 常用输出形式
print(n)
while True: # 捕获异常,最后值的输出
try:
x = next(f)
print(x)
except StopIterator as e:
print('Generator return value:',e.value)
break
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: None
每次 yield 执行后返回,next() 从上次 yield 位置开始
def odd():
print('step 1')
yield 1
print('step 2')
yield 2
print('step 3')
yield(5)
o = odd()
next(o) # 位置停在yield 1处
next(o) # 位置停在yield 2处
next(o) # 位置停在yield 5处
step 1
step 2
step 3
杨辉三角
def triangles():
L = [1]
while True:
yield L
L = [1] + [ L[i]+L[i+1] for i in range(len(L)-1) ] + [1]
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 10:
break
for t in results:
print(t)
迭代器
凡是可以 for
循环的都是 Iterable
, 如 list,tuple,dict,str
和 Iterator
但是 list,tuple,dict,str
不是迭代器,可以通过 iter( list )
变成迭代器
>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
迭代器是通过 next()
不断调用,不断生成,而非直接生成存储所有数据