2019-03-06-day012-生成器与推导式
01 昨日回顾
迭代器:
迭代器有iter方法 next方法就是迭代器
递归:
- 自己调用自己
- 明确的结束条件
递归的最大深度 官方 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
迭代器的特性:
- 惰性机制
- 不能逆行,只能从上向下
- 一次性的
- 省内存
函数名的使用:
- 当做值赋值给变量
- 可以当做返回值被返回
- 可以当做容器里的元素
- 可以当做参数传递
闭包:
- 有一个嵌套函数
- 在嵌套函数内部的函数使用非全局变量
优点: 安全 装饰器需要
缺点: 容易造成内存泄漏
怎么查看???
函数名.__closure__
生成器
- 生成器的本质就是迭代器
- 通过函数变成一个生成器
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__()) # 这样生成一个生成器
函数体存的是不是代码
- 语法分析
- 语义分析
- 词法分析
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__())
总结:
- 生成器的本质就是一个迭代器
- 生成器一定是一个迭代器,迭代器不一定是一个生成器
- 生成器是可以让程序员自己定义的一个迭代器
- 生成器的好处,节省内存空间
- 生成器的特性 一次性的,惰性机制,从上向下
- send相当于 next+传值,第一次触生成器的时候,如果使用send(None)值必须是None,一般我建议你们使用__next__
- python2 iter() next()
python3 iter() next() next() iter() - 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}
- 字典 {1:2,2:4}
###看着像元组的其实是一个 生成器推导式 - 外部需要容器包一下,里边第一个位置 结果 剩下位置都是语句
- 推导式 -- 面试 实现小的需求时可以使用推导式,推导式节省代码
- 推导式不要写太长,可读性查.
3.周一: 装饰器 和 内置函数
2019-03-06-day012-生成器与推导式的更多相关文章
- python note 12 生成器、推导式
1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...
- Day12--Python--生成器,生成器函数,推导式,生成器表达式
一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...
- python全栈开发 生成器 :生成器函数,推导式及生成器表达式
python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- 12生成器,send,推导式
# 1.生成器的本质就是迭代器 # 2.通过函数变成一个生成器 # def func(): # print(1) # yield 5 # 我的函数走到这了 # print(2) # yield 9 # ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
- python基础 (迭代器回顾,生成器,推导式)
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- python基础(9)-迭代器&生成器函数&生成器进阶&推导式
迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...
- python基础学习笔记——生成器与推导式
生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...
随机推荐
- PTA L2-001 紧急救援
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 输入: 输入第一行给出4个正整数N ...
- Spring Boot常用注解
SpringBoot注解大全 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@Enable ...
- shiro中记住我功能
Shiro提供了记住我(RememberMe)的功能,比如访问如淘宝等一些网站时,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问,基本流程如下: 1.首先在登录页面选中Reme ...
- CF-339D-线段树
http://codeforces.com/problemset/problem/339/D 给出一个序列.每次更改其中一个值然后询问序列的f(),序列的f()定义为: 每相邻两个元素按位或得到长度减 ...
- MySQL共享表空间概念
1.表空间概念 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间 ...
- express中app.get和app.use的解析
app.get(path,callback)中的callback只能是函数 app.use(path,callback)中的callback既可以是router对象又可以是函数 当其是router对象 ...
- flex布局文本过长不显示省略号
https://www.cnblogs.com/tgxh/p/6916930.html 解决方法: 给flex子元素添加css: white-space: nowrap; text-overflow: ...
- Hive QL的实例
1.创建电影评分表 create table film_table ( userid int, movieid int, rating int, unixtime string ) row forma ...
- hdu多校1004 Distinct Values
Distinct Values Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): ...
- net core 上传并使用EPPlus导入Excel文件
1. cshtml页面 form <form id="form" method="post" action="/SaveValueBatch& ...