具有多个’for’子句和单个’if’的python理解

具有多个’for’子句和单个’if’的python理解,第1张

概述想象一个离散的x,y,z空间:我正在尝试创建一个迭代器,它将返回位于距点一定径向距离的球体内的所有点. 我的方法是先看一个更大的立方体内的所有点,保证包含所需的所有点,然后剔除或跳过太远的点. 我的第一次尝试是: x,y,z=(0,0,1)dist=2#this doesn't workit_0=((x+xp,y+yp,z+zp) for xp in range(-dist,dist+1) 想象一个离散的x,y,z空间:我正在尝试创建一个迭代器,它将返回位于距点一定径向距离的球体内的所有点.

我的方法是先看一个更大的立方体内的所有点,保证包含所需的所有点,然后剔除或跳过太远的点.

我的第一次尝试是:

x,z=(0,1)dist=2#this doesn't workit_0=((x+xp,y+yp,z+zp) for xp in range(-dist,dist+1) for yp in range(-dist,dist+1) for zp in range(-dist,dist+1) if ( ((x-xp)**2+(y-yp)**2+(z-zp)**2) <= dist**2+sys.float_info.epsilon ) )

一个简单的

for d,e,f in it_0:    #print(d,f)    print( ((x-d)**2+(y-e)**2+(z-f)**2) <= dist**2+sys.float_info.epsilon,d,f)

验证it_0不会产生正确的结果.我相信它只是将条件应用于第三个(即:z)’for’子句

以下作品:

it_1=((x+xp,dist+1))it_2=filter( lambda p: ((x-p[0])**2+(y-p[1])**2+(z-p[2])**2) <= dist**2+sys.float_info.epsilon,it_1)

它收集所有点,然后过滤那些不符合条件的点.

我希望可能有一种方法可以纠正第一次尝试的实现,或者使这些表达式更具可读性或紧凑性.

解决方法 首先,我建议你用itertools.product()替换triply-nested for循环,如下所示:
import itertools as itit_1 = it.product(range(-dist,dist+1),repeat=3)

如果您使用的是Python 2.x,则应使用@R_403_5250@()而不是range().

接下来,您可以只使用生成器表达式而不是使用filter():

it_2=(x,z for x,z in it_1 if ((x-p[0])**2+(y-p[1])**2+(z-p[2])**2) <= dist**2+sys.float_info.epsilon)

这将避免Python 2.x中的一些开销(因为filter()构建一个列表),但对于Python 3.x将大致相同;甚至在Python 2.x中你可以使用itertools.ifilter().

但为了便于阅读,我会将整个内容打包到一个生成器中,如下所示:

import itertools as itimport sysdef sphere_points(radius=0,origin=(0,0),epsilon=sys.float_info.epsilon):    x0,y0,z0 = origin    limit = radius**2 + epsilon    for x,z in it.product(range(-radius,radius+1),repeat=3):        if (x**2 + y**2 + z**2) <= limit:            yIEld (x+x0,y+y0,z+z0)

我刚刚更改了原始代码中的代码. x,y和z的每个范围都调整为以原点为中心.当我测试半径为0的代码时,我正确地返回一个点,即原点.

请注意,我为函数提供了参数,允许您指定半径,原点,甚至是用于epsilon的值,每个都有默认值.我还将原点元组解压缩为显式变量;我不确定Python是否会优化索引 *** 作,但这样我们就知道循环内不会有任何索引. (我认为Python编译器可能会将限制计算提升到循环之外,但为了便于阅读,我实际上更喜欢它在自己的行上,如图所示.)

我认为上面的内容与在原生Python中编写的速度一样快,我认为这是可读性方面的重大改进.

附:如果使用Cython重做代码,这段代码可能运行得更快.

http://cython.org/

编辑:代码简化了@eryksun在评论中的建议.

总结

以上是内存溢出为你收集整理的具有多个’for’子句和单个’if’的python理解全部内容,希望文章能够帮你解决具有多个’for’子句和单个’if’的python理解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207475.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存