递归函数、生成器、推导式

本文详细介绍了递归函数的概念及其特点,强调了递归必须设定终点以防止无限循环。接着,讨论了生成器的定义与创建方式,特别是如何使用`yield`关键字,并展示了如何通过`__next_()`、`next()`和`send(value)`来操作生成器。最后,文章探讨了不同类型的推导式,包括列表推导式、字典推导式和集合推导式,以及它们在处理可迭代对象时的角色。同时,还讲解了可迭代对象、迭代器和生成器之间的关系,指出生成器既是可迭代的也是迭代器。
摘要由CSDN通过智能技术生成

递归函数:

自己调用自己的函数一般称为递归函数。
特点:
1.递归函数必须要设定终点,不设置的话会造成死循环
2.通常都会有一个入口

def sum(n):
    if n == 0:
        return 0
    else:
        return n + sum(n - 1)

print(sum(5))
# 输出结果:
15  # 15=5+4+3+2+1

生成器:generator

定义一个生成器

g = (x * 3 for x in range(8))

此时g就是一个生成器

定义生成器的方式二:借助函数完成
只要函数中出现了yield关键字,说明函数就不是函数,变成生成器了

def func():
    n = 0
    while True:
        n += 1
        print(n)
        yield n  # 相当于return n + 暂停

生成器方法:
g.__next_()
通过调用__next_
() 方式得到元素
使用类似列表推导式 []–>()
使用变量接收 g = (x+2 for x in list)
每次调用都会产生一个新的元素 如果元素产生完毕 再次调用的话就会产生异常StopIteration

next(g)
next(生成器对象) builtins 系统内置函数
每次调用都会产生一个新的元素 如果元素产生完毕 再次调用的话就会产生异常StopIteration

send(value)
向每次生成器调用中传值

推导式:

列表推导式 :

[x for x in range(20)]s = [x for x in range(20)]
print(s)

# 输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

在列表推导式中加入条件判断if

print([(a, b) for a in range(5) for b in range(10) if a % 2 == 0 and b % 2 == 1])

print([(a, b) for a in range(5) if a % 2 == 0 for b in range(10) if b % 2 == 1])

# 输出结果:
[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9)]
[(0, 1), (0, 3), (0, 5), (0, 7), (0, 9), (2, 1), (2, 3), (2, 5), (2, 7), (2, 9), (4, 1), (4, 3), (4, 5), (4, 7), (4, 9)]

在列表推导式中加入条件判断if···else···

list1 = [4000, 5000, 6000]

newlist = [i + 200 if i > 5000 else i + 500 for i in list1]
print(newlist)

# 输出结果:
[4500, 5500, 6200]

字典推导式:用法和列表推导式基本相同,需要的参数变为了两个,定义的符号从[]变为了{}

{k:v for k,v in xxx}
newdict = {value: key for key, value in dict1.items()}

集合推导式
类似列表推导式,在列表推导式的基础上添加了一个去除重复项的功能

list1 = [5,5,2,4,8,1,6,4,5]

print({x for x in list1 if x > 3})
print([x for x in list1 if x > 3])

# 输出结果:
{8, 4, 5, 6}
[5, 5, 4, 8, 6, 4, 5]

Iterable 可迭代的对象
使用Iterable需要先导入:
from collections import Iterable

判断元素是否为可迭代的:

from collections import Iterable

l = [x for x in range(6)]

print(isinstance(l, Iterable))
# 输出结果:
True

迭代是访问集合元素的一种方式
迭代器是一个可以记住遍历的位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
可以被next()函数调用并不断返回下一个值的对象称为迭代器
在Python中,一边循环一边计算的机制,称为生成器:generator。生成器一定是迭代器

可迭代的 不一定是 迭代器
生成器是可迭代的也是迭代器
列表元组等 是可迭代的但不是迭代器

通过iter()函数将可迭代的变成了一个迭代器
next(iter1)

list1 = [1, 2, 3, 4, 6]
iter1 = iter(list1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值