python基础(生成器、列表推导式)

一、 生成器:

  1.1 特点:

    生成器的本质就是一个迭代器
    生成器一定是一个迭代器,迭代器不一定是一个生成器
    生成器是可以让程序员自己定义的一个迭代器
    生成器的好处,节省内存空间
    生成器的特性继承迭代器特性:一次性的,惰性机制,从上向下

  1.2 生成器的普通方法

  
# 方式一:

# 每次创建一个新的生成器对象
def func():
    print(111)
    yield 5
    print(222)
    yield 10

print(func().__next__())  # 每次创建一个新的生成器对象
print(func().__next__())


# 方式二:

# 只创建一个生成器
def func():
    print(111)
    yield 5   # 碰到yield不结束就挂起
    print(222)
    yield 10

generator = func()  # 只创建一个生成器
print(generator.__next__())  # 第一次打印 111 5 生成器停在yield 5 处 挂起
print(generator.__next__())  # 第二次打印 222 10 生成器停在yield 10 处 挂起
print(generator.__next__())  # 第三次无法找到新的生成器,报错


# python2  next() iter()
# python3  next() __next__() iter()  __iter__()



# 方式三:
next() == generator.__next__() 方法相同
def func():
    print(111)
    yield 5
    print(222)
    yield 10

generator = func()
print(next(generator))  # 第一次打印 111 5 生成器停在yield 5 处
print(next(generator))  # 第二次打印 222 10 生成器停在yield 10 处
print(next(generator))  # 第三次无法找到新的生成器,报错
View Code

  1.3 生成器的send()方法:

    1.3.1 特点:

      第一次调用生成器的时候使用send里边的值必须是None,建议一般第一次获取生成器时使用.__next__() 方法

    1.3.2 范式:

  
# 第一次调用生成器的时候使用send里边的值必须是None,一般第一次获取生成器时使用__next__

# 范式
def func():
    print(111)
    a = yield 5   # 1.挂起 2.返回值 3.接收值
    print(a)   # 123

    print(222)
    b = yield 10
    print(b)

generator = func()
print(generator.send(None))  # 第一次使用send必须为None
print(generator.send('123'))  # 第一次传参获取yield位置,send = next() + 传值
print(generator.send('456'))  # 第二次传参获取yield位置

aa = generator.__next__()  # aa=123
print(aa + 5)   # 生成器返回参数
print(generator.__next__())
View Code

  1.4 生成器的from()方法:

    1.4.1  特点:

      将可迭代对象元素逐个返回

  
# 生成器from方法:
# yield from 将可迭代对象元素逐个返回

def func():
    lst = [1, 2, 3, 4, 5]
    lst1 = [6, 7, 8, 9]

    # for index in lst:  # 普通方法执行yield方法
    #     yield index

    yield from lst  # yield from 方法实现
    yield from lst1  # 第二个yield from

g = func()
print(next(g))   # 1
print(next(g))   # 2
print(next(g))   # 3
print(next(g))   # 4
print(next(g))   # 5

print(next(g))   # 6
print(next(g))   # 7
print(next(g))   # 8
print(next(g))   # 9
View Code

二、 列表推导式:

  2.1 推导式类型:

    列表
    集合 {1,2,3}
    字典 {1:2,2:4}

  2.2 推导式的特点:

    实现小的需求时可以使用推导式,推导式节省代码
    推导式不要写太长,可读性差

  2.3 推导式的常用方法: 

    2.3.1 样式:

      [结果 语法] #容器 列表推导式
      {结果 语法} #容器 字典推导式或集合推导式
      (结果 语法) # 生成器推导式

    2.3.2 列表推导式:

  
# 列表推导式:

# 方式一:
# [结果 语法]
li = []   # 普通实现方法:
for i in range(10):
    li.append(i)
print(li)

print([i for i in range(10)])    # 推导式实现方法



# 方式二:
# [结果 语法 条件]
li = []
for i in range(10):
    if i%2 == 1:
        li.append(i)
print(li)

print([i for i in range(10) if i%2 == 0])  # 过滤(筛选)条件


# 方式三:
# [最后一个语法的结果 语法 语法]
li = []                    # 实现for嵌套循环方法:
for i in range(10):
    for em in range(3):
        li.append(em)
print(li)

print([j for i in range(10) for em in range(3) for j in range(5)])  # 推导式循环
View Code

    2.3.3 集合与字典推导式:

  
# 集合推导式

# {结果 语法} 容器
s = {i for i in range(10)}   # 生成一个集合
print(s)



# 字典推导式:

print({i:i+1 for i in range(10)})  # 生成一个字典
View Code

    2.3.4 生成器推导式:

      注意: 生成器推导式类似于元组,但并不存在元组推导式!

  
# 生成器推导式
# 注意只有生成器推导式(没有元组推导式)

g = (i for i in range(4))
print(g)           # <generator object <genexpr> at 0x00000150D6D20EB8>
print(g.__next__())  # 0
print(g.__next__())  # 1
print(g.__next__())  # 2
print(g.__next__())  # 3
View Code

 

posted @ 2019-03-16 16:01  Amorphous  阅读(193)  评论(0编辑  收藏  举报