一、切片
在list、tuple、字符串中获取其中某个或某些元素时,可以使用循环获取,但python提供了一种更加简洁的方式—-切片
- 使用切片的形式
list = [1, 2, 3, 45, 6]
# 认识切片
# 形式list[x:y:z] x为开始索引, y为结束索引(不会取到结束索引的元素), z为跨度(即隔z个元素后才切割取值)
print(list[0:len(list):1])
- 使用
# 取偶数索引的元素
print(list[1::2])
# 正向取前三个(索引值为0,1,2.....n), 可以省略跨度,默认值为1
print(list[:3])
# 逆向切片(从后往前-1,-2,-3.....-n) ;取前三个
print(list[:-2])
# 只写[:]就可以原样复制一个list:
print(list[:])
- 例子:
# 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
def trim(s):
if s[:1] != " " and s[-1:] != " ": # 如果首尾都没有空格,则返回字符串
return s
elif s[:1] == " ": # 如果前面有则把空格去掉,再递归检查
return trim(s[1:])
# elif s[-1:] == " ":
else: # 如果尾部有则把空格去掉,再递归检查
return trim(s[:-1])
# 测试:
if trim('hello ') != 'hello':
print('测试失败!')
elif trim(' hello') != 'hello':
print('测试失败!')
elif trim(' hello ') != 'hello':
print('测试失败!')
elif trim(' hello world ') != 'hello world':
print('测试失败!')
elif trim('') != '':
print('测试失败!')
elif trim(' ') != '':
print('测试失败!')
else:
print('测试成功!')
二、迭代
- 迭代的形式
# list的迭代, 打印元素
list_ = [1, 2, 3, 4, 5]
for i in list_:
print(i)
# 字典迭代
dict_ = {'name': 'a1', 'age': 10, 'weight': 55}
# 字典默认迭代键
for key in dict_:
print(key)
# 迭代字典的值
for value in dict_.values():
print(value)
# 键值一起迭代
for key, value in dict_.items():
print("key=" + key + " value=" + str(value))
# 元组的迭代
tuple_ = (1, 2, 'v')
for t in tuple_:
print(t)
# 字符串
str_ = "ABCD"
for s in str_:
print(s)
- 判断可迭代的对象
# 通过collections模块的Iterable类型判断一个对象是可迭代对象;
from collections import Iterable
if (isinstance("abc", Iterable)):
print("str 可迭代")
if (isinstance([1, 2, 3], Iterable)):
print("list 可迭代")
if (isinstance({'name': 'a1', 'age': 10, 'weight': 55}, Iterable)):
print("dict 可迭代")
if (isinstance(('a', 'b', 'c'), Iterable)):
print("tuple 可迭代")
if (isinstance(123, Iterable)):
print("int 可迭代")
# 结果
str 可迭代
list 可迭代
dict 可迭代
tuple 可迭代
- 使用Python内置的enumerate函数实现下标迭代方式
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
# 结果
0 A
1 B
2 C
三、列表生成式
- 形式
# 生成1-9的列表
list_ = [x for x in list(range(1, 10))]
print(list_)
- 特性
# for前的x为得出的结果, 可以进行操作
# 结果的平方
list_2 = [x * x for x in list(range(1, 10))]
print(list_2)
# for循环后可添加条件
# 1-9列表中,筛选出偶数
list_3 = [x for x in list(range(1, 10)) if (x % 2 == 0)]
print(list_3)
# 也可以有多层for循环
# 两层for循环实现打印乘法口诀表
list_4 = [str(n) + " * " + str(m) + "=" + str(n * m) for n in list(range(1, 10)) for m in list(range(1, 10))]
print(list_4)
四、生成器
- 创建方式
# 1. 只要把一个列表生成式的[]改成(), 就创建了一个generator:
g = (x * x for x in range(10))
print(type(g))
'''
g类型为 <class 'generator'>
'''
# 2. 使用函数方式创建generator
def odd():
print('step 1')
yield 1
print('step 2')
yield (3)
print('step 3')
yield (5)
- 打印出generator的每一个元素—-使用next()函数或迭代
g = (x for x in range(10))
# 使用next()
print("使用next()")
print(next(g))
# 迭代
print("使用迭代")
for n in g:
print(n)
- 注意:
- generator的执行顺序:
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
- 用while循环调用generator时,发现拿不到generator的return语句的返回值。(没搞明白)
# 如果想要在while循环调用generator时,拿到返回值,
# 必须捕获StopIteration错误,
# 返回值包含在StopIteration的value
g = (x for x in range(10))
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
五、迭代器
- 什么是迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
- 判断对象是否是迭代器
# 使用函数 isinstance
from collections import Iterator
if (isinstance([], Iterator)):
print("list is Iterator without iter()")
- 转换为可迭代的对象,使用含函数iter()
if (isinstance(iter([]), Iterator)):
print("list is Iterator with iter()")
- 小结:
- 凡是可作用于for循环的对象都是Iterable类型;
- 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
- 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。