# 迭代器和生成器
# 迭代器
# 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
# 可迭代的 --> 可迭代协议:含有__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. C++类模板 template <class T>

    C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径.可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数. 比如: class Compare_int class ...

  2. shell while-ssh

    Linux shell脚本使用while循环执行ssh的注意事项 浏览:86次 出处信息 如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了 ...

  3. eclipse outline 中图标含义

    先说颜色:  绿色:public  黄色:protected  蓝色:no modifier  红色:private 再说形状:  实心:method  空心:variable  实心中间有字母C:c ...

  4. IIS Express 配置 Json

    在VS2013中调试D3官网的一些Sample过程中遇到了一个奇怪的问题:凡是Sample中使用的数据源是json文件时候,smaple 就无法在浏览器中正常运行.经调试后发现根本原因是IIS Exp ...

  5. 剑指offer五十之数组中重复的数字

    一.题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  6. (转)Mysql技术内幕InnoDB存储引擎-事务&备份&性能调优

    事务 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC ...

  7. Git&GitHub学习日志

    Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件.作为一个 ...

  8. UBUNTU 安装中文语言包命令

    本次在UBUNTU安装国外程序,需要中文包 才会是中文. apt-get install language-pack-zh-hans 解决.

  9. Android中的各种访问权限Permission含义

    android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android. ...

  10. 机器学习--Gradient Boosting Machine(GBM)调参方法详解

    一.GBM参数 总的来说GBM的参数可以被归为三类: 树参数:调节模型中每个决策树的性质 Boosting参数:调节模型中boosting的操作 其他模型参数:调节模型总体的各项运作 1.树参数 现在 ...