15_Python高级特性之生成式与生成器

本文深入探讨了Python的高级特性——生成式和生成器。从列表生成式开始,阐述了其语法形式和实例应用,包括带有过滤功能和循环嵌套的情况。接着介绍了集合生成式和字典生成式,及其在实际操作中的示例。重点讲解了生成器的概念、使用场景、创建方法,如列表生成式的转换和yield关键字的应用,并解析了生成器的特点,强调了其在处理大数据时节省内存的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、列表生成式

列表生成式就是一个用来生成列表的特定语法形式的表达式。
是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
普通的语法格式:[exp for iter_var in iterable]

带过滤功能语法格式: [exp for iter_var in iterable if_exp]

循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

二、列表生成式实例

1、 生成一个2n+1的数字列表,n为从3到11的数字。

nums_list = [2 * n + 1 for n in range(3, 12)]
print(nums_list)

在这里插入图片描述
2、求以r为半径的圆的面积和周长(r的范围从1到10)

import math

circle = [(math.pi * (r ** 2), 2 * math.pi * r) for r in range(1, 11)]
print(circle)

在这里插入图片描述
3、 找出1~100之间所有的质数。

def isPrime(num):
    """
    判断num是否为质数?
    质数: 只能被1和它本身整除的数就是质数. (负数不是质数, 1不是质数)
    :param num:
    :return:Bool(True, False)

    num=5: 5%2==0  5%3==0 5%4==0     (2, 5)   (2, num)
    num=6: 6%2==0(---不需要继续判断了) ----> 不是质数
    """
    if num <= 1:
        return False
    else:
        for i in range(2, num):
            if num % i == 0:
                return  False
        else:
            return  True


#  找出1~100之间所有的质数。
primeNums = [num for num in range(1, 101) if isPrime(num)]
print(primeNums)

在这里插入图片描述
4、找出1~100之间所有奇数, 并且返回一个列表。如果能被3整除, 返回返回该数的平方,否则返回该数的三次方 。

nums = [num ** 2 if num % 3 == 0 else num ** 3 for num in range(1, 101, 2)]
print(nums)

在这里插入图片描述

三、集合生成式和字典生成式

字典生成式:用来快速生成字典;
集合生成式:用来快速生成集合;

四、集合生成式和字典生成式实例

1). 将字典的key值和value值调换;

d ={i:str(i) for i in range(10)}
print(d)

d1={value:key for key,value in d.items()}
print(d1)

在这里插入图片描述
2). 大小写计数合并 : 已知字典{‘A’:10, ‘b’:5, ‘a’:2}, 合并后为{‘a’:12, ‘b’:5}
key值最终全部为小写.

"""

  大小写计数合并 : 已知字典{'A':10, 'b':5, 'a':2}, 合并后为{'a':12, 'b':5}
      key值最终全部为小写.
"""

d= {
    'A':10,
    'a':40,
    'b':10,
    'c':2,
    'C':5
}

# 合并字典; d.get(key.lower(), 0), 如果key'值不存在,默认返回0;
dict_result = {key.lower():d.get(key.lower(), 0) + d.get(key.upper(), 0)for key, value in d.items()}
print(dict_result)

在这里插入图片描述

五、生成器

(1)什么叫生成器?
在Python中,一边循环一边计算的机制,称为生成器:Generator。
(2)什么时候需要使用生成器?
一般情况下我们不需要使用生成器,只有当我们因为性能限制才需要用到,比如我们使用python读取一
个10g的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以
使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.

(3)如何创建生成器?
第一种方法: 列表生成式的改写。 []改成()
第一种方法: yield关键字

# 第一种方法: 列表生成式的改写。 []改成()
# nums = [i**2 for i in range(100)]
# print(nums)


nums = (i**2 for i in range(5))
# print(nums)  # <generator object <genexpr> at 0x7f40e1b642a0>
# print(type(nums)) # <class 'generator'>

# for num in nums:
#     print(num)

# __next__和next()效果相同(面向对象-魔术方法)
# nums.__next__()
# print(next(nums))
# print(next(nums))
# print(next(nums))

在这里插入图片描述
(4)如何打印生成器的每一个元素呢?
通过for循环, 依次计算并生成每一个元素。
如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。

(5)生成器的特点是什么?

  1. 节约内存
    
  2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是
    说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新
    创建的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值