python列表推导式生成随机数_python 【迭代器 生成器 列表推导式】
python 【迭代器 生成器 列表推导式】
一、迭代器
1、迭代器
如何从列表、字典中取值的
index索引 ,key
for循环
凡是可以使用for循环取值的都是可迭代的
可迭代协议 :内部含有__iter__方法的都是可迭代的
迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器
print(dir([1,2,3]))
lst_iter = [1,2,3].__iter__()
print(lst_iter.__next__())
print(lst_iter.__next__())
print(lst_iter.__next__())
for i in [1,2,3]: # [1,2,3].__iter__()
print(i)
l = [1,2,3]
lst_iter = iter(l) # l.__iter__()
while True:
try:
print(next(lst_iter)) # lst_iter.__next__()
except StopIteration:
break
2、什么是可迭代的
什么是迭代器===》迭代器 = iter(可迭代的),自带一个__next__方法
可迭代 最大的优势 节省内存
from collections import Iterable,Iterator
print(range(100000000))
print(isinstance(range(100000000),Iterable)) #判断当前是否是一个可迭代的
print(isinstance(range(100000000),Iterator)) #是不是一个迭代器
py2 range #不管range多少 会生成一个列表 这个列表将用来存储所有的值
py3 range #不管range多少 都不会实际的生成任何一个值
3、迭代器优势
a、节省内存
b、取一个值就能进行接下来的计算 ,而不需要等到所有的值都计算出来才开始接下来的运算 —— 快
4、迭代器的特性:惰性运算
二、生成器 Generator
自己写的迭代器 就是一个生成器
两种自己写生成器(迭代器)的机制:生成器函数 生成器表达式
1、生成器函数 ---凡是带有yield的函数就是一个生成器函数
def func():
print(‘****‘)
yield 1
print(‘^^^^‘)
yield 2 # 记录当前所在的位置,等待下一次next来触发函数的状态
g = func()
print(‘--‘,next(g))
print(‘--‘,next(g))
# 生成器函数的调用不会触发代码的执行,而是会返回一个生成器(迭代器)
# 想要生成器函数执行,需要用next
def cloth_g(num):
for i in range(num):
yield ‘cloth%s‘%i
g = cloth_g(1000)
print(next(g))
print(next(g))
print(next(g))
2、使用生成器监听文件输入的例子
import time
def listen_file():
with open(‘userinfo‘) as f:
while True:
line = f.readline() #readline 不会自动停止
if line.strip():
yield line.strip()
time.sleep(0.1)
g = listen_file()
for line in g:
print(line)
3、send关键字
def func():
print(11111)
ret1 = yield 1
print(22222,‘ret1 :‘)
ret2 = yield 2
print(33333,‘ret2 :‘,ret2)
yield 3
g = func()
ret = next(g)
print(ret)
print(g.send(‘alex‘)) # 在执行next的过程中 传递一个参数 给生成器函数的内部
print(g.send(‘金老板‘))
# 想生成器中传递值 有一个激活的过程 第一次必须要用next触发这个生成器
生成实例:计算移动平均值
#月度 的 天平均收入
def average():
sum_money = 0
day = 0
avg = 0
while True:
money = yield avg
sum_money += money
day += 1
avg = sum_money/day
g = average()
next(g)
print(g.send(200))
print(g.send(300))
print(g.send(600))
5、预激生成器
def init(func):
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
next(ret) # 预激活
return ret
return inner
@init
def average():
sum_money = 0
day = 0
avg = 0
while True:
money = yield avg
sum_money += money
day += 1
avg = sum_money/day
g = average()
print(g.send(200))
print(g.send(300))
print(g.send(600))
6、yield from
def generator_func():
yield from range(5)
yield from ‘hello‘
for i in range(5):
yield i
for j in ‘hello‘:
yield j
g = generator_func()
for i in generator_func():
print(i)
g1 = generator_func()
g2 = generator_func()
next(generator_func())
next(generator_func())
6、如何从生成器中取值
第一种 :next 随时都可以停止 最后一次会报错
print(next(g))
print(next(g))
第二种 :for循环 从头到尾遍历一次 不遇到break、return不会停止
for i in g:
print(i)
第三种 :list tuple 数据类型的强转 会把所有的数据都加载到内存里 非常的浪费内存
print(g)
print(list(g))
7、总结:
生成器函数 是我们python程序员实现迭代器的一种手段
主要特征是 在函数中 含有yield
调用一个生成器函数 不会执行这个函数中的带码 只是会获得一个生成器(迭代器)
只有从生成器中取值的时候,才会执行函数内部的带码,且每获取一个数据才执行得到这个数据的代码
获取数据的方式包括: next send 循环 数据类型的强制转化
yield返回值的简便方法,如果本身就是循环一个可迭代的,且要把可迭代数据中的每一个元素都返回 可以用yield from
使用send的时候,在生成器创造出来之后需要进行预激,这一步可以使用装饰器完成
生成器的特点 : 节省内存 惰性运算
生成器用来解决 内存问题 和程序功能之间的解耦
8、列表推导式
new_lst = []
for i in range(10):
new_lst.append(i**2)
print(new_lst)
print([i**2 for i in range(10)])
l = [1,2,3,-5,6,20,-7]
print([i%2 for i in range(10)])
l = [1,2,3,-5,6,20,-7]
print([num for num in l if num%2 == 1])
#30以内所有能被3整除的数
print([i for i in range(30) if i%3 ==0])
#30以内所有能被3整除的数的平方
print([i**2 for i in range(30) if i%3 ==0])
#找到嵌套列表中名字含有两个‘e’的所有名字
names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘, ‘Joe‘],
[‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]]
print([name for name_lst in names for name in name_lst if name.count(‘e‘) == 2])
9、生成器表达式
l = [i for i in range(30) if i%3 ==0] # 列表推倒式 排序的时候
g = (i for i in range(30) if i%3 ==0) # 生成器表达式 庞大数据量的时候 使用生成器表达式
print(l)
print(g)
for i in g:print(i)
10、面试题
def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))
print(list(g2))
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
for n in [1,3,10]:
g=(add(n,i) for i in g)
print(list(g))
#一个生成器 只能取一次
#生成器在不找它要值的时候始终不执行
#当他执行的时候,要以执行时候的所有变量值为准
python列表推导式生成随机数_python 【迭代器 生成器 列表推导式】相关推荐
- python列表推导式生成随机数_python列表推导式
列表推导式介绍 列表推导式是Python中快速创建列表的一种方式. 之前我们要创建(Python3中)一个元素是0-9的列表,我们可能会像下面这么写: >>> list(range( ...
- python列表推导式生成随机数_Python:列表推导式/生成器推导式
一,列表推导式和生成器表达式 l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1) 1.把列 ...
- Python中random模块生成随机数详解
Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...
- python如何生成随机数_python如何生成随机数
如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文 ...
- python中uniform randint_python生成随机数:uniform(), randint(), gauss(), expovariate()
1 模块:random内建模块,伪随机数生成器 使用Mersenne Twister的伪随机数生成器PRNG进行生成,它以一个确定的数字作为属于,并为其生成一个随机数:为了安全起见,不要用PRNG生成 ...
- python 生成字符串_Python字符串生成器,按照特定的顺序
我正在制作一个程序,运行时会根据我定义的字符列表生成一个随机字符串. 的代码是:Python字符串生成器,按照特定的顺序 from random import randint from random ...
- Python:numpy实现生成随机数,忽略warnings
''' 作者:Dust ''' # 生成随机数:numpy下的random import numpy as npy import warnings warnings.filterwarnings(&q ...
- python 列表有几个元素_python怎么向列表中添加多个元素
python的列表是多变灵活的数据结构,向列表中添加元素,可以使用append()方法,或者extend()方法,还可使用insert()方法.insert() 主要用来插入元素,当向列表末尾添加元素 ...
- python使用random模块生成随机数、实现随机乱序和随机抽样?
如何使用random模块生成随机数.实现随机乱序和随机抽样? random.random()函数可以生成[0.0, 1.0)之间的随机浮点数. random.uniform(a, b)函数可以生成[a ...
最新文章
- HTML5新特性---Form表单前台通过正则表达式自动验证邮箱
- 操作系统内存管理--简单、页式、段式、段页式
- Tensorflow 神经网络作业手写数字识别 训练、回测准确率
- weak password
- linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用
- python跳过错误_Pandas之read_csv()读取文件跳过报错行的解决
- 英雄由此诞生------直击微软2008发布大会
- 为什么JS中0.1+0.2 != 0.3
- 如何一次性保存html图片大小,保存网页图片的几种方法(批量)
- Visual Studio 2022 启用CodeLens - 程序抬头显示(查看字段、方法、类的引用)
- U盘格式化了怎样恢复还原(必学技能)
- 做跨境如何去降低成本?
- c语言1至100的累乘求和,c语言 累加累乘课件.ppt
- 鸿蒙智联 HarmonyOS Connect 设备小艺语音的接入
- Chrome浏览器显示“Adobe flash player已过期”问题之解决
- 深度学习从入门到精通——生成对抗网络原理
- 计算机3d打印技术论文,3D打印技术小论文
- 微型计算机显卡必须插在主板的,花小钱办大事 不同型号N卡组建SLI系统
- 2023年全国最新二级建造师精选真题及答案51
- 2021-08-16 WPF控件专题 WrapPanel 控件详解
热门文章
- SQL Server 2012 管理新特性:AlwaysOn
- linux判断文件是否为空,linux shell编程 如何判断一个文件是否为空
- pythonbool类型数组生成_对numpy中布尔型数组的处理方法详解
- 我们的高中教育造就了什么?
- 三部门部署开展非学科类校外培训收费专项整治工作
- 万象双环设计+原色双影像极致体验 华为P50标准版9月29日正式开售
- 双十一快到了,快递却不干了?
- 有钱鹅!腾讯奖励万名员工每人一台16999元华为手机,员工“十动然鱼”
- 趁618买iPhone 11还是等iPhone 12?李楠有话要说
- iPhone 12系列起售价又要涨了?128GB起步...