点我
高级特性
切片
- 切片--->获取片段
- 格式:name [start : end : 步长 ]
- 获取范围:起始包含、结束不包含
默认值:
- 起始默认值为0
- 结束默认值为len(name)
- 步长默认为1
获取顺序:
- 步长 > 0 从左到右取值
- 步长 < 0 从右到左取值
- 特殊:反转字符串:name[::-1]
l = ['a','b','c','d']
l1 = l[::-1]
l2 = l[:len(l):2]
print(l1)
print(l2)
运行结果:
['d', 'c', 'b', 'a']
['a', 'c']
迭代
- 可通过for循环从其中依次拿到数据进行使用,这样的过程称为遍历,也叫迭代
- 遍历(迭代)读取一条数据供我们使用的对象称之为可迭代对象
d = {'zs':90,'ww':80,'ls':100}
for i in d:
print(i)
运行结果:
zs
ww
ls
列表生成式
- 通过一对中括号生成各种list
# 生成偶数的平方列表
print([ i * i for i in range(1,11) if i % 2 == 0])
运行结果:
[4, 16, 36, 64, 100]
生成器(generator)
- 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的
- 如果创建一个包含50万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
- 否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间
- 在Python中,这种一边循环一边计算的机制,称为生成器:generator
创建generator
直接将列表生成式的[] 换为()
- next() 函数输出,直到StopIteration异常终止迭代
- 通过for循环输出,自动屏蔽StopIteration异常
如果一个函数定义中包含
yield
关键字,就是一个生成器- generator函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
#简单例子 生成器函数
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
通过next()函数遍历
>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
#创建生成器
g = (x * x for x in range(10))
>>> g = (x * x for x in range(10))
>>> type(g)
<class 'generator'>
# 创建生成器函数
# 斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b # print(b)
a, b = b, a + b
n = n + 1
return 'done'
可迭代对象(Iterable)
可直接使用for循环的数据类型有两大类:
- 集合数据类型,如list、tuple、dict、set、str等
- generator,生成器和带有yield的生成器函数
这些可直接作用于for循环的对象统称为可迭代对象(Iterable)
判断是否为可迭代对象
isinstance(对象, Iterable)
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
迭代器(Iterator)
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration
错误表示无法继续返回下一个值
可以为next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)
判断是否为迭代器
使用isinstance(对象, Iterator)
注意
- 生成器都是迭代器,但是list、dict、dict等虽然是可迭代对象,却不是迭代器
- list、dict、str等可迭代对象变为迭代器可使用iter()函数
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
Python的for
循环本质上就是通过不断调用next()
函数实现
分类:
Python
版权申明
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论