5.3 Python高级特性之-列表生成式、生成器、迭代器

一、 列表生成式

是Python内置的非常简单却强大的可以用来创建list的生成式
具体可根据如下案例理解,且代码也是可用的
""" 1、 生成[0,1,2,3,4,5,6]这样列表 """
print(list(range(0, 7)))
""" 2、 生成[0,1,4,9,16,25]的列表, 即:0*0,1*1,2*2.....5*5 """
# 1) 基本方法-繁琐方法
list1 = list()
for one in range(0, 6):
    list1.append(one * one)
# 2) 列表表达式-简化方式
list1 = [one * one for one in range(0, 6)]
print(list1)
"""3、【if判断】获取1到20之间的属于偶数的正整数"""
list2 = [x for x in range(1, 21) if x % 2 == 0]
print(list2)
"""4、【双for循环】遍历两列表,并逐一组合条件"""
M, N = ["A1", "B1", "C1"], ["M", "N", "C1"]
list3 = [f"{m}+{n}" for m in M for n in N if m != n]  
list4 = [f"{m}+{n}" if m != n else m for m in M for n in N]  # 如果有else条件, if 和else逻辑均在for前
print(list3)
print(list4)
"""5、【遍历dict】提取用户信息,并列表存储,元素=  属性=属性值"""
student1 = {"name": "Lujier", "sex": "Female", "height": 1.65, "hair": "long"}
stu_info_list = [f"{stu_key}={stu_value}" for stu_key, stu_value in student1.items()]
print(stu_info_list)

在这里插入图片描述

二、 生成器

   通过学习列表表达式, 我们能够快速创建列表,但是:列表容量是有限的, 如果想要创建大数量的列表,会占用很大的内存空间,,但有时候我们并不是所
 有元素都会去访问,相当于可能会浪费空间。 故而便有了“生成器”
(generator)这样的概念, 可以在循环的过程中不断推算出后续的元素,这样
就无需直接创建完整的list,就节省了大量空间, 至于如何创建生成器&生成器
元素访问, 可根据下方截图案例自行尝试。
[关键字] 惰性计算的序列、next()
# 1、 基本内容
L = [x * x for x in range(5)]
# print(L)
g = (x * x for x in range(5))
print(g)
# 通过next()函数获得generator的下一个返回值
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# 无元素可访问,会报错StopIteration
print(next(g))

for one in g:
   print(one)
#2、 经典案例-斐波拉契
# [普通实现]斐波拉契数列用列表生成式-前n个数
def fibonacci_sequence(num):
    n, current_before, current = 1, 0, 1
    while n < num + 1:
        print(current)
        n, current_before, current = n + 1, current, current_before + current

# [生成器]斐波拉契数列
def fib(num):
    n, current_before, current = 1, 0, 1
    while n < num + 1:
        yield current
        n, current_before, current = n + 1, current, current_before + current

fibonacci_sequence(7)
print(fib(7))
mm = fib(7)
print(next(mm))
print(next(mm))

在这里插入图片描述

# 3、经典案例3-杨辉三角
def triangles(top_num):
    n, before, current = 2, [1], [1, 1]
    while n < top_num + 1:
        yield before
        n, before = n + 1, current
        current = [1] + [current[index] + current[index + 

在这里插入图片描述

三、 迭代器

基础理解:
一、 可被for循环的数据类型有:
   1、 【基础数据类型】 list、tuple、str、dict、set
   2、   generator: 包含生成器和生成器函数(yield)

二、 可迭代对象(Iterable)概念
   可以直接用for循环的对象统称为可迭代对象
   可以用isinstance()判断是否是可迭代对象,具体如下:
  
      from collections.abc import Iterable
      aaa = triangles(7)
       print(isinstance(aaa, Iterable)) # 结果返回true
  
三、 迭代器(Iterator)概念:
     迭代器:  可以被next()函数调用并不断返回下一个值的对象称为迭代器
     生成器:  可以作用于for循环,还可以next返回下一个值,直到越界抛出StopIteration

 四、生成器、迭代器区别
  生成器都是:迭代器
  可迭代对象不一定是迭代器: 如: list、dict、str
  对于是可迭代对象的类型但又不是迭代器,那么其实是可以转化的: iter()函数
【注】 以上所有内容见如下代码案例:

1、 判断是否为迭代器

在这里插入图片描述

2、可迭代对象但非迭代器next()

在这里插入图片描述

3、 iter()函数转化为迭代器

在这里插入图片描述

4、 for 循环遍历–原理同next()

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值