用 Python 生成从一个到另一个的列表 用 python 生成列表
一、列表生成式
列表生成式就是python设置的可以用来可以生成列表的。
如要生成一个0-9的列表我们可以通过以下代码实现:
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但是如果生成的列表较为复杂呢?例如生成包含0²、1²、2²。。。9²这样一个列表;
>>> L = []
>>> for i in range(10):
... L.append(i*i)
...
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在上述代码中,我们通过for循环将数值append到列表L中,虽然可以实现,但是也是low爆了~~~,以下通过一行代码搞定!!!
>>> [i*i for i in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
除此之外,列表生成式还可以生成更为复杂的列表。通过列表生成式可以快速生成格式化的列表、字典
>>> d ={"name":"nadech","age":"22","address":"NANJING"}
>>> [key+"="+value for key,value in d.items()]
['name=nadech', 'age=22', 'address=NANJING']
>>> from numpy.random import randn
>>> data ={i:randn() for i in range(7)}
>>> data
{0: 0.05824826050892203, 1: 0.08046687699730207, 2: 1.860740808203487, 3: 1.577136929714018, 4: -0.5473223742129686, 5: 0.13849329354272613, 6: 1.4133333866268165}
二、生成器
通过列表生成式,我们可以直接创建一个列表的所有元素。
但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表可以按照需求,一边循环一边计算,就可以解决上述问题。这种机制就叫做生成器(generator)。
生成器共有两种形式,第一种就是把列表生成式中的[ ]改为( );第二种就是含有yield
>>> g = (i*i for i in range(1,3))
>>> next(g)
1
>>> next(g)
4
>>> next(g)
Traceback (most recent call last):
File "", line 1, in StopIteration
>>> (i*i for i in range(10))
at 0x0000029EA41490F8>
>>> for i in g:
... print(i)
...
1
4
上述代码加粗部分可以看出,创建生成器返回的是一个生成器对象的地址,并不是直接包含所有的元素的列表。
通过调用next,可以生成下个元素的值,不过在实际使用中我们并不会通过多次调用next,而是通过for循环来获取生成器的元素。
第二种我们要介绍的就是包含yield的,首先我们先实现打印输出这样一串数字,除了第一个数,后一个数都等于前两个数字的和 1,1,2,3,5,8....这就是著名的斐波那契数列,不要被这名字吓到,总之就是实现输出上边的一串数字。
>>> def fib(max):
... n, a, b = 0, 0, 1
... while n < max:
... print(b)
... a, b = b, a + b
... n = n + 1
... return 'done'
...
>>> fib(5)
1
1
2
3
5
'done'
接下来,我们对上述代码进行一处修改,把print改为yield
>>> def fib(max):
... n,a,b = 0,0,1
... while n
... yield(b)
... a,b = b,a+b
... n=n+1
... return "done"
...
>>> fib(5)
>>> o = fib(6)
>>> for i in o:
... print (i)
...
1
1
2
3
5
8
可见,命令窗口返回一个generator对象的内存地址。通过迭代输出生成器 o中的数字。
但是,细心的朋友可能发现,我们通过for循环来输出生成器的内容的时候,并没有输出return的“done”,这样我们就需要通过next来依次输出,同时就伴随另外一个问题的产生,当next输出到最后的时候,会抛出一个StopIteration的异常,我们需要将次异常捕获。(异常的捕获后边会详细介绍)
>>> while True:
... try:
... x = next(o)
... print("o:",x)
... except StopIteration as e:
... print("RETURN VALUE:", e.value)
... break
...
o: 1
o: 1
o: 2
o: 3
o: 5
o: 8
RETURN VALUE: done
三、生成器的并行
搞清楚了生成器的特点,那么我们简单的利用生成器来实现一个并行的效果,实际上这是一个假的并行。
这个生成器并行的例子,叫做大猪和小猪吃包子。
import time
def consumer(name):
print("%s 准备好吃包子了" % name)
while True:
type = yield #此处的yield,可以接受producer中send的传值
print("%s包子被%s 吃了" % (type, name))
def producer(name):
print("%s 已经准备好做包子了~~~~"%name)
c = consumer("大猪") #这时候不是正常的函数调用了,只是生成一个生成器队形,不执行函数体内容,调用next会执行
c1 = consumer("小猪")
next(c)
next(c1)
items = ["白菜","菠菜","生菜"]
for item in items :
time.sleep(1)
print("%s已经做好了两个包子"%name)
c.send(item)
c1.send(item)
producer("nadech")
上一篇: python 列表生成器
下一篇: 微服务技术栈 SpringCloud+RabbitMQ+Docker+Redis+Search+Distributed (V):分布式搜索 ES-medium
推荐阅读
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
python 生成一个从 1 到 10 的列表_python-list generator(i)
-
用 Python 生成从一个到另一个的列表 用 python 生成列表