【python笔记】第十一节 生成器和迭代器

博主昵称:摆烂阳

博主主页跳转链接
‍博主研究方向:web渗透测试 、python编程
博主寄语:希望本篇文章能给大家带来帮助,有不足的地方,希望友友们给予指导
推荐《牛客网》——找工作神器|笔试题库|>面试经验|实习经验内推|求职就业|
点击链接开始学习

目录

  • 推荐学习刷题网站
    • 1、牛客网的优点
    • 2、应该从哪里入手
  • 一、递归函数
  • 二、生成器
  • 三、迭代器
  • 本章小结

推荐学习刷题网站

这次给大家推荐个宝藏网站牛客网

点击跳转到刷题页面

1、牛客网的优点

牛客网的优点在于纯中文网站,不用担心各种术语,对于每一个题目,都给出了顶层的框图以及接口定义,也给出题解思路,可以说对初学者极其友好.而且,牛客网的编程界面,设计的也很舒服,左右对称式,读题的时候非常舒服,如果没读懂题目,可以看题解,牛客网的题解都是每道题配套的,而不是向其他刷题网站的题解只给你解释这个知识点。

【python笔记】第十一节 生成器和迭代器_第1张图片

2、应该从哪里入手

在牛客上刷题的时候,有3个部分可以重点刷一下:

一个是公司真题页面,这里面的试卷都是企业提供的真实校招笔试题,可以选择公司和岗位方向,真实体验题目难易程度;
一个是在线编程页面,不仅有剑指offer,leetcode等经典编程题,还有历年校招编程真题汇总,多在牛客上练习,也是为以后的校招笔试做准备,因为越来越多的公司都选择用牛客的笔试系统了,一定要熟悉牛客的oj,为校招提前做准备;
还有一个专项练习部分,可以根据知识点选择具体的题目进行练习,对于复习基础知识部分是非常有帮助的。

大家刚开始刷牛客题的时候,可以先去找简单的题目去刷,缓慢的过渡到别的难度。
刷题一定要坚持,不要半途而废。牛客上面的题目还是蛮不错的,大家加油!

点击链接开始刷题学习

一、递归函数

递归:如果一个函数内部调用了自己那么就叫递归。

def f():
    print("你好,我叫aa")
    f()
f()

1.如果要定义递归函数,必须要有出口,因为无限递归会导致内存溢出
2.设计一个出口,不断的向出口接近

def f(x):
    print("你好,我叫aa")
    if x == 10:
        return  # 结束函数
    f(x + 1)


f(1)

案例:求987654321 的结果,就是9的阶乘

n! = n * (n-1)!

9的阶乘 = 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
9的阶乘 = 9 * 8!
8的阶乘 = 8 * 7!
7的阶乘 = 7 * 6!
6的阶乘 = 6 * 5!
5的阶乘 = 5 * 4!
4的阶乘 = 4 * 3!
3的阶乘 = 3 * 2!
2的阶乘 = 2 * 1!

f(x) = x * f(x-1) # 阶乘公式


def f(x):
    if x == 1:
        return 1
    return x * f(x - 1)
print(f(5))
 f(5) = 5 * f(4)
      5 * 4 * f(3)
      5 * 4 * 3 * f(2)
     5 * 4 * 3 * 2 * f(1)  # f(1) = 1

二、生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。 在调用生成器运行的过程中,每次遇到yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next () 方法时从当前位置继续运行。

生成器:相当于存储一种厨师

# s = [x for x in range(10000000)]

f = (x for x in range(10))

print(next(f)) # 输出f的第1个值
print(next(f)) # 输出f的第2个值
print(next(f)) # 输出f的第3个值
....

一次性做出所有菜

for i in f:
    print(i)

 

def f():
    print("f1")
    yield 1  # 挂起
    print("f2")
    yield 2  # 挂起

def g():
    print("g1")
    yield 1
    print("g2")
    yield 2

可以使用生成器 多个任务 交叉执行

g1 = f()
g2 = g()
next(g1)
next(g2)
next(g1)
next(g2)
# f1 g1 f2 g2

生成器的两种创建方式

1.(i for i in range(1,10))
2.yiled 关键字实现

def f():
    print("f1")
    yield 1  # 挂起
    print("f2")
    yield 2  # 挂起
    print("f3")
    yield 3
g = f()

迭代遍历的本质:

不断通过 i = next(g)

for i in g:
    print(i)

for i in 可迭代对象

从现象来说,只要是可以for循环的都是可迭代对象
从本质来说,是内置有iter方法的是可迭代对象

能for循环是因为有一个__iter__()方法
可迭代对象:对象拥有iter方法的

三、迭代器

在Python中,迭代器是遵循迭代协议的对象。 使用iter ()从任何序列对象中得到迭代器(如 list, tuple, dictionary, set 等)。

生成器就是迭代器

迭代器需要满足两个条件:

1.有iter方法
2.有next方法

l = [1,2,3,4]
l.__iter__()
iter(l) # 本质上就是  l.__iter__()

iter : 返回一个迭代器对象
         

for循环内部本质3个事情

1.调用可迭代对象的iter方法返回一个迭代器
2.不断调用迭代器的next方法
3.处理异常

本章小结

学习完本章节内容后,最好能够结合题目巩固相关知识。学习的步骤就是学习基础知识+不断的刷题

点击下方链接进入牛客刷题

点击跳转到刷题页面

本文是本人以前笔记,博主主页跳转链接
如果有哪里不对的话欢迎各位大佬指出问题,本人也是初学python,希望可以和各位朋友一起学习进步。

点击跳转到博主python专栏:
如果有喜欢web安全的朋友,请在web渗透专栏中进行查看
点击跳转到博主web渗透专栏

你可能感兴趣的:(python,python,开发语言,numpy)