# 迭代器和生成器
# 迭代器
# 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
# 可迭代的 --> 可迭代协议:含有__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知识点总结的更多相关文章

  1. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  2. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  3. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  4. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  5. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  6. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  7. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  8. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

  9. python学习之老男孩python全栈第九期_day015知识点总结

    # 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...

随机推荐

  1. robot framework 测试/预发/线上环境快捷切换

    通常情况下布署的三套环境:测试.预发及线上环境.调试或者辅助验证测试时,切环境改变量甚是麻烦.这些变量包括但不限于:一些url信息,数据库信息,预置用户信息等. 切换环境方法一:使用变量文件,通过判断 ...

  2. express form/ajax 后端获取前端数据

    -------------------2017/12/02补充:缺了一个重要条件... var bodyParser = require('body-parser');var app = expres ...

  3. Mongoose 分页查询优化、获取数据总长度

    无论是传统网页还是 ajax api,我们都不得不进行数据分页,一来节省带宽二来提升页面响应速度.作为一个数据完备的 web 应用,做好分页功能能极大提升用户体验. 简单的分页查询 在 mongoos ...

  4. day 17python 面对对象之继承

    一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A ...

  5. Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】

    写在前面的: 作为一个控制专业的女研究生,不知道每天在研究什么,但总归逃脱不了码代码的命运.之前也学习过一些C语言.C++,基础嘛,稍稍微有一些.本不想走上码农的道路,天真烂漫的过此生(白日梦过程中. ...

  6. spring基础回顾

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  7. 剑指offer五十八之对称的二叉树

    一.题目 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.二.思路 递归做,详见代码 三.代码 /* public class TreeN ...

  8. C++的开源跨平台日志库glog学习研究(三)--杂项

    在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...

  9. Java之IO(八)PipedIutputStream和PipedOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7056278.html 1.前言 本章介绍Java的IO体系中最后一对字节流--管道流.之前在字节数组流的时候就说 ...

  10. Postman—前置请求脚本

    前言 在前面的文章中已经说到了,在Postman中可以编写以下两种脚本: 前置请求脚本 测试脚本 这两种脚本的运行时机都不一样,在上一篇<Postman—脚本介绍>中已经详细的进行了介绍. ...