01 昨日回顾

迭代器:

迭代器有iter方法 next方法就是迭代器

递归:

  1. 自己调用自己
  2. 明确的结束条件

递归的最大深度 官方 1000 实际测试:998/997

import sys
sys.setrecursionlimit(100000)

修改最大深度

递归的效率不高,尾递归的效率和for循环是一样

递归的应用场景: 在不明确循环次数的时候,就可以使用递归

for循环的本质:

li =[1,23,3]
iter(li) == li.__iter__()
li = li.__iter__()
while True:
    try:
        print(li.__next__())
    except StopIteration:
        break

迭代器的特性:

  1. 惰性机制
  2. 不能逆行,只能从上向下
  3. 一次性的
  4. 省内存

函数名的使用:

  1. 当做值赋值给变量
  2. 可以当做返回值被返回
  3. 可以当做容器里的元素
  4. 可以当做参数传递

闭包:

  1. 有一个嵌套函数
  2. 在嵌套函数内部的函数使用非全局变量

优点: 安全 装饰器需要

缺点: 容易造成内存泄漏

怎么查看???

函数名.__closure__

生成器

  1. 生成器的本质就是迭代器
  2. 通过函数变成一个生成器
def func():
    print(1)
    yield 5  # 我的函数走到这了
    print(2)
    yield 9  # 我的函数走到这了
g = func()  # 生成一个生成器
print(g.__next__())
print(g.__next__())
print(list(range(10000)))
def func():
    print(1)
    # return 5
    yield 5
print(func().__next__())  # 这样生成一个生成器
print(func().__next__())  # 这样生成一个生成器
print(func().__next__())  # 这样生成一个生成器
print(func().__next__())  # 这样生成一个生成器

函数体存的是不是代码

  1. 语法分析
  2. 语义分析
  3. 词法分析

python2 and python3 区别

--python2 next() iter()

--python3 next() next() iter() iter()

大批量的数据的时候首先要想到生成器

def func():
    print(1)
    yield 5  # 我的函数走到这了
    print(2)
    yield 9  # 我的函数走到这了
g = func()  # 生成一个生成器
print(g.__next__())
print(g.__next__())
碰到return就结束函数
碰到yield不结束就挂起
生成器的好处,非常节省内存
def func():
    print(1)
    a = yield 2  # 1.挂起 2.返回值 3.接受值
    print(a)   # '123'
    print(3)
    b = yield 4
    print(b)   #'234'
    c = yield 9
g = func()
print(g.__next__())   #1 2  g.send(None)
print(g.send('123'))  # send = next+传值
print(g.send('234'))  # send = next+传值
# 第一次调用生成器的时候使用send里边的值必须是None
def func():
    yield 1
    yield 2
g = func()
ret = g.__next__()
print(ret+4)
print(g.__next__())
def func():
    li = [1,2,3,4]
    # yield li
    yield from li
ret = func()  # 把生成器的地址给了ret
print('is ret',ret.__next__())
# 执行ret这个变量的指向的生成器地址
print('is ret',ret)
# 在全局空间找到一个变量叫做ret的,打印它的值 值就是生成器的地址
def func():
    li = [1,2,3,4]
    l2 = [5,6,7,8]
    # yield from li
    # yield from l2
    for i in li:
        yield i
    for em in l2:
        yield em
ret = func()  # 把生成器的地址给了ret
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())
print('is ret',ret.__next__())

总结:

  1. 生成器的本质就是一个迭代器
  2. 生成器一定是一个迭代器,迭代器不一定是一个生成器
  3. 生成器是可以让程序员自己定义的一个迭代器
  4. 生成器的好处,节省内存空间
  5. 生成器的特性 一次性的,惰性机制,从上向下
  6. send相当于 next+传值,第一次触生成器的时候,如果使用send(None)值必须是None,一般我建议你们使用__next__
  7. python2 iter() next()
    python3 iter() next() next() iter()
  8. yield from 将可迭代对象元素逐个返回
def func():
    with open('t','r',encoding='utf-8')as f:
        for i in f:
            i = i.strip('\r\n')
            yield i
g = func()
for i in range(10):
    print(g.__next__())

推导式

列表推导式

li = []
for i in range(10):
    li.append(i)
print(li)
print([i for i in range(10)])
[结果 语法] #容器
li = []
for i in range(10):
    if i%2 == 1:
        li.append(i)
print(li)
print([i for i in range(10) if i%2 == 0])  # 过滤(筛选)
li = []
for i in range(10):
    for em in range(3):
        li.append(em)
print(li)
print([j for i in range(10) for em in range(3) for j in range(5)])

集合推导式

s = {i for i in range(10)}
print(s)
{结果 语法} 容器

字典推导式:

print({i:i+1 for i in range(10)})
print(type({1,2,32,4}))
g = (i for i in range(10))
{'1':1,'2':2}
{'1','2'}
{1:2,2:3,3:4}
{'美女':1999,1999:2}

推导式:

  1. 列表
  2. 集合
  3. 字典
  4. 生成器推导式

推导式总结:

  1. 列表
  2. 集合 {1,2,3}
  3. 字典 {1:2,2:4}
    ###看着像元组的其实是一个 生成器推导式
  4. 外部需要容器包一下,里边第一个位置 结果 剩下位置都是语句
  5. 推导式 -- 面试 实现小的需求时可以使用推导式,推导式节省代码
  6. 推导式不要写太长,可读性查.

3.周一: 装饰器 和 内置函数

2019-03-06-day012-生成器与推导式的更多相关文章

  1. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

  2. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

  3. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  4. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  5. 12生成器,send,推导式

    # 1.生成器的本质就是迭代器 # 2.通过函数变成一个生成器 # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # ...

  6. python基础之 迭代器回顾,生成器,推导式

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  7. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  8. python基础 (迭代器回顾,生成器,推导式)

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  9. python基础(9)-迭代器&生成器函数&生成器进阶&推导式

    迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...

  10. python基础学习笔记——生成器与推导式

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

随机推荐

  1. Bacterial Melee CodeForces - 756D (dp去重)

    大意: 给定字符串, 每次可以任选一个字符$x$, 将$x$左侧或右侧也改为$x$, 求最终能得到多少种字符串. 首先可以观察到最终字符串将连续相同字符合并后一定是原字符串的子序列 并且可以观察到相同 ...

  2. uva-11324-SCC+dp

    https://vjudge.net/problem/UVA-11324 给出一幅有向图,问最大能找到多少个节点,使得这些节点中任意两个节点之间都至少有一条可达路径. 找出SCC后缩点求权重最大路即可 ...

  3. python 小练习 5

    Py从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992, 这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和 ...

  4. vue虚拟DOM源码学习-vnode的挂载和更新流程

    代码如下: <div id="app"> {{someVar}} </div> <script type="text/javascript& ...

  5. python实现简单的聊天小程序

    概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服 ...

  6. Qt_qwt图形开发

    QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图.它为具有技术专业背景的程序提供GUI组件和一组实用类 ...

  7. mfscli的使用方法(解决mfscgi响应慢的问题)

    在moosefs中,mfscgi是一个python写的server程序,其中的数据是调用同样的python工具mfscli实现的. 每当用浏览器打开mfscgi的时候,它要把所有的表数据请求一遍,非常 ...

  8. nodejs 修改端口号 process.env.PORT(window环境下)

    各个环境下,nodejs设置process.env.PORT的值的命令,如下1.linux环境下: PORT= node app.js 使用上面命令每次都需要重新设置,如果想设置一次永久生效,使用下面 ...

  9. import 和 from … import 模块的变量、方法引用差异

    import 和 from … import 模块的变量.方法引用差异 还是上面例子中的模块 support.py: def print_func( par ): print "Hello ...

  10. Ubuntu16.10下使用VSCode开发.netcore

    按照通常的套路,首先创建一个空白的解决方案,需要用到.netcore sdk命令: dotnet new sln -o dotnetcore_tutrorial 这个时候可以看到在目标目录下生成了一个 ...