7月10日安排
 完成所有函数作业和思维导图整理
 
【45.函数-生成器】
如果数据是有规律的,就可以先生成一个数据,等数据执行的时候再执行,也就是在真正调用数据之前,拿到数据的生成规律,而是拿到生成数据的公式,每取一次加一个容器。
这样的好处就是可以不浪费内存空间。
generator
a2 = (i for i in range(1000))
#只是一个算法,还没有创建
next(a2)
#这就是生成了一个元素,可以一直接着生成
生成器只能往后生成,不能往前调用
【46.函数-斐波那契】
a3 = (i for i in range(5))#这样的循环方式不会报错for具有检测报错机制,while 循环会报错
python2里的range是直接生成列表,如果range的数据很大的话,列表生成就会很慢,但是python3的range就是一个公式,还没有创建;python2里的xrange才会和python3里的range相同。
如果推算的公式比较复杂,那么列表生成式是不行的,因为它只支持三元运算
复杂的算法可以使用函数,比如斐波那契数列
斐波那契数列:除了第一个和第二个数外,任意一个数都可以由前两个数相加得到
1,1,2,3,5,8,13,21,34...
def fib(max):
    n,a,b = 0,0,1
    while n <max:
        print(b)
        a,b = b,a+b
        n = n+1
    return 'done'
 
-----------------------
def fib(max):
    n,a,b = 0,0,1
    while n <max:
        yield b #
        a,b = b,a+b
        n = n+1
       return 'done'
f = fib(18)
for i in f:
    print(i)
输出结果
yield 冻结当前的代码,把函数的执行过程冻结在这里,并且把值返回
好处:可以把函数的每一个值都可以返回出来,有了生成器yield以后,就有数据返回给外部了
函数里有yield,函数内部的代码就不再执行,只是生成一个生成器对象
【47.函数-生成器调用】
生成生成器以后一般是不用next的方法的直接用循环取取值比较好
for循环和while循环的区别:
1.for循环不会报错;2.for循环的时候可以不用next语法
正常情况下就会使用for循环
python3里的range底层也是一个生成器,可以节省内存
python2里的xrange==python3里的range是一样的,都是生成器
【48.函数-函数写生成器】
生成器的创建方式
1.列表生成式(只能用三元运算符进行简单的运算)
2.函数
自己实现一个range
def range2(n):
    count = 0
    while count <n:
        print(count)
        count += 1
        yield count
new = range2(10)
next(new)
next(new)
yield会暂停函数的执行,并返回当前执行的数据
yield会暂停函数的执行,并返回当前执行的数据
yield会暂停函数的执行,并返回当前执行的数据
重要的事情说3遍!!!
next会唤醒冻结的函数的执行过程,直到遇到下一个yield
总结:
1.生成器可以把函数执行的每一个步骤都通过yield返回出去(yield可以理解为暂停)
【49.函数-生成器send方法】
只要函数里有yield,就代表这个函数就转换为生成器了,
如果一个函数里既有yield又有return,是不能执行return的语句的,不能返回return的值,会报错,因为这个函数已经被转换成生成器了,这个生成器一旦执行结束,就不会再执行了,想再执行是不行的
send的作用
1.唤醒并继续执行生成器
2.发送一个信息到生成器内部
def range2(n):
    count = 0
    while count <n:
        print('count',count)
        count += 1
        sign = yield count
        if sign == 'stop':
            break
new = range2(10)
n1 = next(new)
new.send('stop')
yield是返回值,等待下一次执行
next其实就是和send原理一样,只不过是默认发送了一个None,但是send就可以发送任何需要的值了
【50.函数-迭代器】
可以直接用于for循环的数据类型有以下几种:
1.集合数据类型,如list、tuple、dict、set、str等
2.generator,包括生成器和带yield的generator function
这些可以作用域for循环的对象统称为可迭代对象:Iterable
一般情况下可以使用isinstance()判断一个对象是否是迭代器对象
而生成器不但可以作用于for循环,还可以被next()不断调用并返回下一个值,直到最后抛出异常,表示无法继续返回下一值
注意:可以被next()函数调用并不断返回下一值的对象称为迭代器
生成器都是迭代器,都是列表、字典、字符串虽然都是迭代对象,但是都不是迭代器,因为不能使用next()方法,但是可以使用iter()函数将它们变成迭代器
迭代器就是一个数据流,生成迭代器的时候不需要规定终止点,没有终止也不需要终止条件,这样的就表示为数据流。
这是因为Python的Iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出错误,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个序列,所以Iterator的计算是惰性的,只有在需要返回下一个数据时才回去计算。
总结:
凡是可以作用for循环的对象都是Iterator类型;
生成器一定是迭代器,迭代器不一定是生成器(可以自己写对象)
 
 
 
 
 
 
 
 
 
 
 
 

路飞学城Python-Day12的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  9. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

  10. 路飞学城-Python开发-第一章

    # 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...

随机推荐

  1. java和android文件加密小结

    最近遇到一个文件加密的问题,自己读写的,安全性虽然还可以,但是速度慢,影响体验. Cipher虽然速度相当快,但是android和java有某些api存在不兼容: 问题解决: 方法引用自:https: ...

  2. 使用Git--将本地项目提交到Github

    前置工作 1. 在GitHub官网注册一个GitHub账号: 2. 安装git工具,在Git官网下载对应版本的Git: 方法一: 1. 进入Github首页,点击New repository新建一个项 ...

  3. [luogu4195 Spoj3105] Mod (大步小步)

    传送门 题目描述 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. 输入输出格式 输入格式: 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a ...

  4. Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js

    一些理论知识 先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一 ...

  5. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 1.什么是Set?(what) Set是Collection容器的一个子接口,它不允许出现 ...

  6. HDU——T 1054 Strategic Game

    http://acm.hdu.edu.cn/showproblem.php?pid=1054 Time Limit: 20000/10000 MS (Java/Others)    Memory Li ...

  7. Linux下基于多线程的echo

    准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧. 在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能.那么,到底在服务 ...

  8. HDU 4324 Contest 3

    直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include < ...

  9. POJ 2773

    不经意看见dis后的“mod”一词后,瞬间有了思路,点进去看,却发现别人想的和我的不一样——! 我是这样想的,利用的是剩余系+欧几里德带余除法的性质. 若两者GCD=1,则必有除数和余数GCD=1.于 ...

  10. npm API文档

    npm API文档 https://docs.npmjs.com/