一、切片
在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), 可以省略跨度,默认值为1print(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 selif 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 Iterableif (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 A1 B2 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. 使用函数方式创建generatordef odd():print('step 1')yield 1print('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的valueg = (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。
- 判断对象是否是迭代器
# 使用函数 isinstancefrom collections import Iteratorif (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对象。
