# 迭代器和生成器
# 迭代器
# 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
# 可迭代的 --> 可迭代协议:含有__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. Sbulime Text 2 修改选中字符串的颜色

    Sublime Text 2 > Preferences > Browse Packages... 假设当前试用的 Color Scheme 是 Monokai,则在 Color Sche ...

  2. Storm的并行度

    在Storm集群中,运行Topolopy的实体有三个:工作进程,executor(线程),task(任务),下图可以形象的说明他们之间的关系. 工作进程 Storm集群中的一台机器会为一个或则多个To ...

  3. 【xsy1237】 字符转换 矩阵快速幂

    题目大意:给你两个长度都为n,字符集为{a,b,c}的字符串S和T. 对于字符串S的任意一个字符,我们可以用cost[0]的代价,把字符a变成字符b.用cost[1]的代价,把字符b变成c,用cost ...

  4. Java之集合(十一)IdentityHashMap

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7381905.html 1.前言 查看JDK源码总是能发现一些新东西,IdentityHashMap也是Map的一 ...

  5. Java之IO(二)BufferedInputStream和BufferedOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6971234.html 1.前言 本文主要介绍输入输出流中的BufferedInputStream和Buffere ...

  6. 查看LINUX 系统硬件等详细信息

    转载这位朋友[地址] 几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) mor ...

  7. Tomcat 基本配置

    1.配置虚拟目录映射 推荐在 /conf/Catalina/localhost 下新建rand.xml方式建立虚拟目录 其中rand将会被当作映射对象,即外部访问路径. 例子:blog.xml < ...

  8. Python -- 网络编程 -- 认识Python3的urllib库

    Python3的urllib包含5个模块 urllib error parse request response robotparser 各个模块的主要成员: error ['ContentTooSh ...

  9. python笔记06-----常用模块(time,os,sys,random)

    模块 1. 模块的定义和导入 定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名:test.py对应的模块名:test) ...

  10. linux内核学习之保护模式(一)

    来源:http://blog.csdn.net/yishuige/article/details/50434746 这一章涉及intel8086系列cpu的保护模式编程,应该是学习内核编程,驱动编程及 ...