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. HDU 1257 最少拦截系统【最长上升子序列】

    解题思路:可以转化为求最长上升子序列来做,还是可以用an与按升序排列后的an求LCS来做,为防止超时,用滚动数组优化一下就可以了. 最少拦截系统 Time Limit: 2000/1000 MS (J ...

  2. POJ 3624 Charm Bracelet【01背包】

    解题思路:直接套公式就能做的01背包, for(i=1;i<=n;i++) { for(v=w[i];v<=m;v++) f[i,v]=max(f[i,v],f[i-1,v-w[i]]+d ...

  3. 自定义一个简单的web框架

    from wsgiref.simple_server import make_server def book(request):     #视图函数 return [b'<h1> book ...

  4. 从源码中查看当前android版本

    从文件build/core/version_defaults.mk查找PLATFORM_VERSION例如:PLATFORM_VERSION.OPM1 := 8.1.0

  5. Pyhton学习——Day59

    参考博客: http://www.cnblogs.com/wupeiqi/articles/6144178.html Form 1. 验证 2. 生成HTML(保留上次输入内容) 3. 初始化默认是 ...

  6. linux防火墙查看状态firewall、iptable

    一.iptables防火墙1.基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 service ...

  7. php版本过低错误导致的laravel 错误:Illuminate\Foundation\helpers.php on line 233; syntax error, unexpected '?'

    今天运行laravel项目发现出现错误: Parse error: syntax error, unexpected '?'  ..\vendor\laravel\framework\src\Illu ...

  8. [caffe]网络各层参数设置

    数据层 数据层是模型最底层,提供提供数据输入和数据从Blobs转换成别的格式进行保存输出,通常数据预处理(减去均值,放大缩小,裁剪和镜像等)也在这一层设置参数实现. 参数设置: name: 名称 ty ...

  9. Vue中如何在组件内部实现一个双向数据绑定?

    假设有一个输入框组件,用户输入时,同步父组件页面中的数据. 具体思路:父组件通过props传值给子组件,子组件通过 $emit 来通知父组件修改相应的props值,具体实现如下: import Vue ...

  10. JS DOM 实例(5大常用实例)

    第1个实例:循环单击变色 <html lang="en"> <head> <meta charset="UTF-8"> &l ...