Python3求笛卡尔积的两种方法

[本文出自天外归云的博客园]

电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用。百度百科:

笛卡尔乘积是指在数学中,两个集合XY的笛卡尓积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中的一个成员 。

笛卡尔积的符号化为:A×B={(x,y)|x∈A∧y∈B}

求笛卡尔积的两种方法如下,第一种是我自己想的方法,第二种方法是用itertools,对比了一下两种方法的时间消耗,几次测试下来发现itertools的方法稍微慢一点点:

def calc_time(desc=None):
    def calc(func):
        def wrapper(*args, **kwargs):
            from datetime import datetime
            start_time = datetime.now()
            r = func(*args, **kwargs)
            end_time = datetime.now()
            print(f"{desc} Used time: {(end_time-start_time).microseconds} Descartes: {r}")

        return wrapper

    return calc


@calc_time("方法1")
def descartes_1(a, b):
    return [f"{a[i]}{b[j]}" for i in range(len(a)) for j in range(len(b))]


@calc_time("方法2")
def descartes_2(a, b):
    import itertools
    return [f"{i[0]}{i[1]}" for i in itertools.product(a, b)]


if __name__ == '__main__':
    a = [i for i in range(2000)]
    import string
    b = [i for i in string.ascii_lowercase]
    descartes_1(a, b)
    descartes_2(a, b)

测试结果如下:

在求2000个数字和26个小写字母笛卡尔积的情况下,第一种方法比第二种快了1000微秒。

转载于:https://www.cnblogs.com/LanTianYou/p/9138147.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用两个 for 循环来实现尔心形曲线,可以将 x 和 y 的取值范围分别拆分成两个循环,然后在内层循环中计算每个点的坐标并输出。 下面是一个示例代码,可以使用两个 for 循环来打印出尔心形曲线的图形: ```c #include <stdio.h> #include <math.h> int main() { int x, y, r = 16; for (y = r; y >= -r; y--) { for (x = -2 * r; x <= 2 * r; x++) { if (pow(x / 4.0, 2) + pow(y / 4.0, 2) - pow(r, 2) <= 0) { if (pow(x / 4.0, 2) + pow((y - 7 * sin(x / 4.0)) / 4.0, 2) - pow(r, 2) <= 0) { printf("*"); } else { printf(" "); } } else { printf(" "); } } printf("\n"); } return 0; } ``` 在这个示例代码中,我们使用了两个 for 循环分别遍历 y 和 x 的取值范围。在内层循环中,我们使用尔心形曲线的数学方程来计算出每个点的坐标,然后根据坐标和半径的关系来判断这个点是否在曲线上。如果是,我们输出一个字符表示这个点,否则输出一个空格表示这个点不在曲线上。 需要注意的是,在这个示例代码中我们使用了一个常数 r 来表示曲线的半径。同时,为了让图形显示完整,我们将 y 的取值范围从 r 到 -r,x 的取值范围从 -2r 到 2r。如果你希望调整图形的大小和位置,可以调整这些常数的值。 ### 回答2: 要实现尔心形曲线,可以借助两个for循环来控制曲线的生成。 首先,我们需要确定心形曲线的数学表达式。一种常用的表达式是: x = 16 * (sin(t))^3 y = 13 * cos(t) - 5 * cos(2t) - 2 * cos(3t) - cos(4t) 接下来,我们可以使用两个for循环来生成曲线上的每个点。首先,我们需要确定t的取值范围,通常取0到2π(或360度)。然后,我们可以通过设定一个步长来控制t的变化。 下面是一个使用两个for循环实现尔心形曲线的示例代码: ```python import math for t in range(0, 360, 1): t_rad = math.radians(t) # 将角度转换为弧度 x = 16 * (math.sin(t_rad))**3 y = 13 * math.cos(t_rad) - 5 * math.cos(2 * t_rad) - 2 * math.cos(3 * t_rad) - math.cos(4 * t_rad) print(f"({x:.2f}, {y:.2f})") ``` 上述代码中,我们使用了`math.sin()`和`math.cos()`函数来计算正弦和余弦值,`math.radians()`函数将角度转换为弧度。 循环从0到360度(或0到2π)遍历了所有角度值,计算了每一个点的坐标(x,y),并打印出来。 这样,通过两个for循环和尔心形曲线的数学表达式,我们就实现了尔心形曲线的生成。 ### 回答3: 要实现尔心形曲线,可以使用两个for循环来生成坐标点,然后将这些点连接在一起形成心形图案。 首先,我们需要定义一个适当的范围来生成x和y的值。假设x的范围是从-2到2,y的范围是从-3到3。这是一个经验性的范围选择,可以根据实际需要进行调整。 接下来,我们可以使用两个嵌套的for循环来遍历x和y的值。外层的循环控制x的变化,内层的循环控制y的变化。 在每次循环中,我们需要计算该点的距离心形中心的距离,并判断这个距离是否在心形的范围内。如果在范围内,就将这个点添加到心形图案中。 在每次迭代中,我们可以根据当前的x和y的值计算它们与心形中心之间的距离。可以使用勾股定理来计算距离,即sqrt(x^2 + y^2)。 然后,我们可以将这个距离与心形的形状进行比较,来判断该点是否在心形范围内。通常,心形的形状定义为1 - abs(sqrt(x^2 + y^2) - 1)。 如果计算出的距离在这个范围内,我们可以将这个点添加到心形图案中。可以使用符号*或其他字符来表示图案。 完成内外层的循环后,我们就可以得到一个用字符表示的心形图案。 总结起来,使用两个for循环可以遍历心形图案的所有可能的点,判断每个点是否在心形范围内,并将它们连接起来形成心形曲线。根据实际需,可以调整范围和心形的形状来获得不同的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值