参考资料Python教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
三、高级特性
- 切片(左闭右开,索引差值为所取元素的个数)【tuple和字符串都可以看成一种list进行切片操作,操作结果仍是tuple和字符串→所以如果取出来的是数字且要用到,别忘了int一下转化为整数型。】
-
取前3个元素
- L[0:3] (从索引
0
开始取,直到索引2
为止) - 或L[:3] (第一个索引是
0
,可以省略)
- L[0:3] (从索引
-
取倒数两个元素
- L[-2:] (第一个索引是
-2
,第一个索引是0
,取-2,-1;不取0,左闭右开。类似于数轴上负数形式。) - 倒数第一个元素的索引是
-1
- L[-2:] (第一个索引是
-
前10个数,每两个取一个
- L[:10:2]
-
所有数,每5个取一个
- L[::5] (取值的索引是
::
,即前后不限制从所有数值里取)
- L[::5] (取值的索引是
-
所有数实现反转数字的顺序(从后往前取)
L[::-1]
- 迭代
-
通过
for
循环来遍历这个list
或tuple
,这种遍历我们称为迭代(Iteration) -
只要是可迭代对象,无论有无下标,都可以迭代
- 列表
- 字典
- 默认情况下,
dict
迭代的是key。 - 如果要迭代value,可以用
for value in d.values()
- 如果要同时迭代key和value,可以用
for k, v in d.items()
- 默认情况下,
- 字符串
for character in 'ABC':
-
1️⃣判断对象是否可迭代
-
通过
collections.abc
模块的Iterable
类型判断-
>>> from collections.abc import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>> isinstance([1,2,3], Iterable) # list是否可迭代 True >>> isinstance(123, Iterable) # 整数是否可迭代 False
-
-
-
实现下标循环
-
Python内置的
enumerate
函数可以把一个list
变成索引-元素对,这样就可以在for
循环中同时迭代索引和元素本身-
for i, value in enumerate(['A', 'B', 'C']): ... print(i, value)
-
-
- 列表生成式(List Comprehensions)
-
用来创建list,通过一个list推导出另一个list的生成式
-
举例
-
>>> [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] >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
-
-
在一个列表生成式中,
for
前面的if ... else
是表达式;而for
后面的if
是过滤条件,不能带else
。
🚩对比学习 字典推导式Dictionary Comprehension:
-
公式:
{key_expr: value_expr for item in iterable}
key_expr
是对于每个item
计算出的键的表达式。value_expr
是对于每个item
计算出的值的表达式。iterable
是一个可迭代的对象,例如列表、集合、字符串等。
-
示例 1: 创建一个字典,将列表中每个元素的平方作为值
pythonCopy codenumbers = [1, 2, 3, 4, 5] squares_dict = {num: num**2 for num in numbers} print(squares_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
示例 2: 使用条件表达式过滤元素
pythonCopy codenumbers = [1, 2, 3, 4, 5] even_squares_dict = {num: num**2 for num in numbers if num % 2 == 0} print(even_squares_dict) # 输出: {2: 4, 4: 16}
示例 3: 将字符串的字符作为键,其位置作为值
pythonCopy codeword = "hello" char_positions = {char: index for index, char in enumerate(word)} print(char_positions) # 输出: {'h': 0, 'e': 1, 'l': 2, 'o': 3}
-
- 生成器(列表生成式)
- 生成器不但可以作用于
for
循环,还可以被next()
函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值了 - (初步先不用深入了解,后续再补充细节)
- 迭代器Iterator
-
可迭代对象:
Iterable
(可以直接作用于for
循环的对象)- 集合数据类型
list
、tuple
、dict
、set
、str
等
generator
- 生成器
- 带
yield
的generator function
- 集合数据类型
-
可以被
next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
-
2️⃣判断对象是否是迭代器
-
>>> from collections.abc import Iterator >>> isinstance((x for x in range(10)), Iterator) #可能类似这种式子就是迭代器?→生成器都是迭代器! True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
-
-
3️⃣生成器都是
Iterator
对象,但list
、dict
、str
虽然是可迭代对象Iterable
,却不是生成器Iterator
-
4️⃣ 所以:把
list
、dict
、str
等Iterable
变成Iterator
可以使用iter()
函数:>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
-
-
❓ 提问:为什么
list
、dict
、str
等数据类型不是Iterator
?- 这是因为Python的
Iterator
对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration
错误。 - 可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过
next()
函数实现按需计算下一个数据,所以Iterator
的计算是惰性的,只有在需要返回下一个数据时它才会计算。 Iterator
甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
- 这是因为Python的
-
小结
-
凡是可作用于
for
循环的对象都是Iterable
类型❗ -
凡是可作用于
next()
函数的对象都是Iterator
类型❗,它们表示一个惰性计算的序列; -
集合数据类型如
list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
-