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 ...
随机推荐
- POJ 2828Buy Tickets(线段树的单点维护)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 20462 Accepted: 10096 Des ...
- 《JAVA与模式》之桥梁模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...
- Java堆内存溢出模拟
先了解一下Java堆: 关于Java内存区域的分配,可以查看Java运行时数据区域一篇文章. Java堆是虚拟机内存管理中最大的一块区域,该区域是线程共享的,某Java进程中所有的线程都可以访问该区域 ...
- php unset变量
<?php $a="abc"; $b="def"; unset($a,$b); echo $a."\n"; echo $b." ...
- 【9】JMicro微服务-发布订阅消息服务
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...
- Android学习之一
- Func<T,TResult>的使用方法(转载)
public delegate TResult Func <T, TResult>(T arg) 这是一个委托方法,这个方法有一个参数T(T arg),比如int arg,string a ...
- 基于Web实现网络拓扑图
想想好像好久没用写博客了! 由于最近想跳槽了(ps:尽管公司挽留,提出一些异与往常的挽留“制度”,But确实已经死心了) ,发现前一段时间一些做Hadoop,和Spark同事时常来请教网络拓扑图的有关 ...
- EJB3 EntityBean中EntityManager的管理类型
EJB中EntityManager的管理方式有两种:Container-managed EntityManager和Application-managed EntityManager 即容器管理的En ...
- C# 对象哈希码
FCL的设计者认为,如果能将任何对象的任何实例放到哈希集合中,能带来很多好处.但是这里说一点,还是会存在,哈希码类似的情况,这一点大型网站架构这本书中有介绍,最好做下MD5算法.为此,System.O ...