点我

切片

  • 切片--->获取片段
  • 格式:name [start : end : 步长 ]
  • 获取范围:起始包含、结束不包含
  • 默认值:

    1. 起始默认值为0
    2. 结束默认值为len(name)
    3. 步长默认为1
  • 获取顺序:

    1. 步长 > 0 从左到右取值
    2. 步长 < 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

  • 直接将列表生成式的[] 换为()

    1. next() 函数输出,直到StopIteration异常终止迭代
    2. 通过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

评论

-- 评论已关闭 --

目录