python学习之老男孩python全栈第九期_day014知识点总结
# 迭代器和生成器
# 迭代器
# 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir(数据) )
# 可迭代的一定可以被for循环
# 迭代器协议:含有__iter__、__next__的方法
# 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
# 迭代器的特点:
# 很方便使用,且只能取所有的数据取一次
# 节省内存空间 # 生成器
# 生成器的本质就是迭代器
# 生成器的表现形式
# 生成函数
# 生成器表达式
# 生成器函数:
# 含有yield关键字的函数就是生成器函数
# 特点:
# 调用函数之后函数不执行,返回一个生成器
# 调用next方法的时候会取到一个值
# 直到取完最后一个,再执行next会报错
# def generator():
# for i in range(2000000):
# yield '娃哈哈%s'%i
# g = generator() # 调用生成器函数得到一个生成器
# ret = g.__next__() # 每一次执行g.__next__就是从生成器中取值,预示着生成器函数中的代码继续执行
# print(ret)
# num = 0
# for j in g:
# num += 1
# if num > 50:
# break
# print(j) # 从生成器中取值的几个方法
# next
# for
# 数据类型的强制转换:占用内存
def generator():
for i in range(20):
yield '娃哈哈%s' % i
g = generator() # 调用生成器函数得到一个生成器
print(list(g)) # 强制转换需要在全部运行完之后才打印
def generator():
print(123)
content = yield 1
print('=====',content)
print(456)
yield 2
print(789) g = generator()
print('*',g.__next__())
print('**',g.send('hello'))
# print('**',g.send(None)) # send的效果和next一样
# print('***',g.__next__())
# print('*****',g.__next__()) # send 获取下一个值的效果和next基本一致
# 只是在获取下一个值的时候,给上一个值的位置传递一个数据
'''
其实next()和send()在一定意义上作用是相似的
区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去
因此,我们可以看做c.next() 和 c.send(None) 作用是一样的
需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错
最后一个yield不能接受外部的值
'''
# 获取移动平均值
# 比如:计算最近7天的平均值 # def average():
# sum = 0
# count = 0
# avg = 0
# while 1:
# # num = yield
# num = yield avg
# sum += num
# count += 1
# avg = sum/count
#
# avg_g = average()
# avg_g.send(None) # avg_g.__next__()
# print(avg_g.send(10))
# print(avg_g.send(20)) def init(func): # 装饰器 func ==average
def inner(*args,**kwargs):
g = func(*args,**kwargs) # g = average()
g.__next__()
return g
return inner
@init # average == init(average) == inner
def average():
sum = 0
count = 0
avg = 0
while 1:
# num = yield
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average() # --> inner
ret = avg_g.send(10)
print(ret)
ret = avg_g.send(20)
print(ret) # python 3
# def generator():
# a = 'abcde'
# b = '12345'
# for i in a:
# yield i
# for i in b:
# yield i
# g = generator()
# for i in g:
# print(i) def generator():
a = 'abcde'
b = '12345'
yield from a
yield from b
g = generator()
for i in g:
print(i) # 回顾
# send
# send的作用范围和next一样
# 第一次不能用send
# 函数中的最后一个yield不能接收新的值 # 计算移动平均值的例子
# 预激生成器的装饰器的例子
# yield from
# 列表推导式
# egg_list = ['鸡蛋%s'%i for i in range(10)] # 列表推导式
# print(egg_list) # egg_list = []
# for i in range(10):
# egg_list.append('鸡蛋%s'%i)
# print(egg_list) print([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print([i*2 for i in range(10)]) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] # 生成器表达式
g = (i for i in range(10)) # g是一个生成器
print(g)
for i in g:
print(i) # 两者不同点:
# 括号不一样
# 返回值不一样 --> 生成器表达式几乎不占用内存 老母鸡 = ('鸡蛋%s'%i for i in range(10)) # 老母鸡是一个生成器
print(老母鸡)
for 蛋 in 老母鸡:
print(蛋) g = (i*i for i in range(10))
for i in g:
print(i)
# 列表推导式
# [每一个元素或是和元素相关的操作 for 元素 in 可迭代数据类型] # 遍历之后挨个处理
# [满足条件才进行操作的元素 for 元素 in 可迭代数据类型 if 元素相关的条件 ] # 筛选功能 # 1. 30以内所有能被3整除的数
s_list = [i for i in range(30) if i % 3 ==0] # 完整的列表推导式
print(s_list)
#2. 30以内所有能被3整除的数的平方
ret = [i*i for i in range(30) if i % 3 == 0]
print(ret)
# 3. 找到嵌套列表中名字含有两个‘e’的所有名字
names = [
['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']
]
find_name = [i for list1 in names for i in list1 if i.count('e') == 2]
print(find_name) # 字典推导式
# 1. 将一个字典的key和value对调
mcase = {'a': 10, 'b': 34}
dic = {mcase[k]:k for k in mcase}
print(dic) # 2. 合并大小写对应的value值,将k统一成小写
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
# mcase = {'a': 10 + 7, 'b': 34, 'z': 3} mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
print(mcase_frequency) # 集合的推导式
# 1. 计算列表中每个值的平方,自带去重功能
squared = {x*x for x in [1, -1, 2]}
print(squared) # 没有元组推导式 # 各种推倒时:生成器 列表 字典 集合
# 遍历操作
# 筛选操作
python学习之老男孩python全栈第九期_day014知识点总结的更多相关文章
- python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法
一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...
- python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合
一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...
- python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块
一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...
- python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法
一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...
- python学习之老男孩python全栈第九期_day010知识点总结
def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...
- python学习之老男孩python全栈第九期_day007知识点总结
基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...
- python学习之老男孩python全栈第九期_day001知识点总结
1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...
- python学习之老男孩python全栈第九期_day016知识点总结
'''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...
- python学习之老男孩python全栈第九期_day015知识点总结
# 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...
随机推荐
- biz_platform项目过程
1.前台界面主要采用React框架.通过Ajax方式将数据与tornado服务器交互.以下代码为请求后台数据. var ThisPage = React.createClass({ render: f ...
- day 53 Django form 组件 autu 组件
https://github.com/Endless-Clould/homework/tree/master/auto_zujian ---恢复内容开始--- 前情提要: Django 组件 的 fo ...
- mysql层的内存分配
参考 http://www.cnblogs.com/justfortaste/p/3198406.html http://m.blog.csdn.net/blog/IT_PCode/17007833 ...
- QuantLib 金融计算——修复 BatesProcess 中的两个 Bug
QuantLib 金融计算--修复 BatesProcess 中的两个 Bug 我发现了 BatesProcess 中的两个 Bug: 基类 HestonProcess::factors 的返回值取决 ...
- 神策Loagent数据收集 windows部署的坑
部署可以修改bin文件夹下的bat文件.. java改为javaw..无窗口运行 重新启动的时候..要保证上次运行到的日志文件要还在..或者同名文件.. 保证要比之前的文件大些..所以最好是之前的文件 ...
- 11、使用xamarin实现全屏播放rtmp之类的直播视频
直播类的app大部分都是以rtmp hls播放为主.目前主流的app解决方案大部分是引入ijkplayer 这个是基于ffmpeg中的ffplayer实现的. 众所周知ffmpeg的解码能力是一流的. ...
- PCA(主成分分析)和LDA详解
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html http://www.c ...
- (转)MySQL备份原理详解
MySQL备份原理详解 原文:http://www.cnblogs.com/cchust/p/5452557.html 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之 ...
- Filter应用之2-设置某些页面缓存或是不缓存
要想让所有浏览器不缓存页面,需要在每个jsp上加上: <% response.setHeader("expires","-1"); response.se ...
- 【Java并发编程】:volatile变量修饰符
volatile用处说明 在JDK1.2之前,java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程环境下volatile关键 ...