Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在我的狗年到人类年计划中发现错误_Python_Python 3.x_For Loop_While Loop - Fatal编程技术网

Python 在我的狗年到人类年计划中发现错误

Python 在我的狗年到人类年计划中发现错误,python,python-3.x,for-loop,while-loop,Python,Python 3.x,For Loop,While Loop,我是python的初学者 如果输入为5,如何使输出33仅打印一次 最重要的问题是:是否有一种算法可以取代写21的需要 原来的问题是: 人们常说,一个人的年等于7个狗年。有些人认为,最好先把前两个人的年都算作10.5个狗年,然后再把每增加一个人的年算作4个狗年 dog_years=int(输入(“输入狗的年龄以获得其主人的等价物:”) 狗的年龄到人的年龄=10.5*狗的年龄 狗的年龄到人的年龄=4*(狗的年龄-2岁) 狗_1=[] 如果dog_years 0和dog_years我稍微重写了您的

我是python的初学者

  • 如果输入为5,如何使输出33仅打印一次

  • 最重要的问题是:是否有一种算法可以取代写21的需要

  • 原来的问题是:

    人们常说,一个人的年等于7个狗年。有些人认为,最好先把前两个人的年都算作10.5个狗年,然后再把每增加一个人的年算作4个狗年

    dog_years=int(输入(“输入狗的年龄以获得其主人的等价物:”)
    狗的年龄到人的年龄=10.5*狗的年龄
    狗的年龄到人的年龄=4*(狗的年龄-2岁)
    狗_1=[]
    
    如果dog_years 0和dog_years我稍微重写了您的代码,以获得我理解的所需功能:

    # Algorithmic solution
    
    dog_years = int(input("Enter the age of the dog to get it's equivalent for it's owner:" ))
    
    young_year = 10.5
    old_year = 4
    
    human_age = 0
    
    if dog_years < 0:
        print("Please Enter a positive integer whole number")
    else:
        for i in range(dog_years):
            if i < 2:
                human_age += young_year
            else:
                human_age += old_year
        print(f"Your dog is {human_age} human years old.")  
    
    这个问题可以更优雅地用算术来解决:

    # Arithmetic solution
    if dog_years < 0:
        print("Please Enter a positive integer whole number")
    elif dog_years <= 2:
        human_age = dog_years * young_year
    else:
        human_age = 2 * young_year + (dog_years - 2) * old_year
    
    #算术解
    如果狗年<0:
    打印(“请输入一个正整数”)
    
    elif狗年不同转换技术的性能

    检查了以下方法

  • 算术——O(1)复杂度
  • For Loop--O(n)复杂度,其中n是年份
  • Numpy--O(n)复杂性,其中n是年份
  • 生成器——O(n)复杂性,其中n是年份
  • 结果

    # Time using perfplot (https://pypi.org/project/perfplot/)
    perfplot.show(
       setup=lambda n: [randint(0, 25) for _ in range(n)],  # or simply setup=numpy.random.rand
        kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
        labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
        n_range=[2 ** k for k in range(17)],
        xlabel="List Length",
        equality_check= None,
        target_time_per_measurement=1.0
        )
    
    perfplot.show(
       setup=lambda n: [n],  # or simply setup=numpy.random.rand
        kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
        labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
        n_range=[2 ** k for k in range(10)],
        xlabel="Years",
        equality_check= None,
        target_time_per_measurement=1.0
        )
    
    测试1:不同长度的年龄列表,随机年龄介于0到25岁之间

    • 使用算术的最佳性能
    • 对于回路和发电机类似
    • 最糟糕的表现
    测试2:从0到2**10的不同年龄段(尽管对于狗来说,25岁以上的年龄是不现实的)

    • 算术是所有年龄段中表现最好的
    • 对于小于20岁的年龄,回路优于发电机
    • 对于高于20的回路,其性能优于发电机
    • Numpy优于100岁以上的回路和发电机,但在其他方面最差
    代码

    import numpy as np
    from random import randint
    import perfplot
    
    def test_arithmetic(test_years):
      " Arithmetic method test "
      def calc_arithmetic(dog_years):
        " arithmetic conversion O(1) complexity "
        return young_year*dog_years if dog_years <= 2 else 2*young_year + (dog_years-2)*old_year
    
      for years in test_years:
        " Perform over the designated years "
        calc_arithmetic(years)
    
    def test_for_loop(test_years):
      " For loop test runs "
      def calc_for_loop(dog_years):
        human_age = 0
        for i in range(dog_years):
          if i < 2:
            human_age += young_year
          else:
            human_age += old_year
        return human_age
    
      for years in test_years:
        " Perform over the designated years "
        calc_for_loop(years)
    
    def test_np(test_years):
     " Numpy method test runs "
      def calc_np(years):
        " convert using numpy "
        arr = np.ones(years)
        arr[:2] *= young_year
        arr[2:] *= old_year
        return np.sum(arr)
    
      for years in test_years:
        " Perform over the designated years "
        calc_np(years)
    
    def test_generator(test_years):
      def calc_list(years):
        " convert using generator "
        return sum(young_year if i < 2 else old_year for i in range(years))
    
      for years in test_years:
        " Perform over the designated years "
        calc_list(years)
    
    young_year = 10.5
    old_year = 4
    
    输出

    测试2:年龄从0岁到1024岁不等

    # Time using perfplot (https://pypi.org/project/perfplot/)
    perfplot.show(
       setup=lambda n: [randint(0, 25) for _ in range(n)],  # or simply setup=numpy.random.rand
        kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
        labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
        n_range=[2 ** k for k in range(17)],
        xlabel="List Length",
        equality_check= None,
        target_time_per_measurement=1.0
        )
    
    perfplot.show(
       setup=lambda n: [n],  # or simply setup=numpy.random.rand
        kernels=[test_arithmetic, test_np, test_for_loop, test_generator],
        labels=['arithmetic', 'numpy', 'for_loop', 'generator'],
        n_range=[2 ** k for k in range(10)],
        xlabel="Years",
        equality_check= None,
        target_time_per_measurement=1.0
        )
    
    输出

    编辑您的问题标题以应用于该问题。对不起,不清楚您在问什么,能否提供示例和预期输出。for循环中有一条打印语句。这就是你多次指出的原因。“你可能很想了解更多关于NumPy的信息”--对这个简单的问题和初级的编码体验好奇为什么?我添加了一个NumPy解决方案和一个算术解决方案。由于OP正在学习python,我认为numpy中的解决方案对他来说会很有趣。但我可能只是因为我对numpy的偏爱才这么认为。如果你认为这对我的回答没有帮助,我很乐意删除它。@Benji——事实上,我唯一的观点是,作为初学者,在尝试更高级的Python模块(如numpy)之前,他应该对基础知识有很好的理解。调查问卷询问“是否有一种算法来代替21”。我认为你的算术解是他们for-loop解的一个更聪明的实现。然而,我认为您的算术解决方案甚至更好,因为它更快(即常数时间),更简单,并且只使用Python初学者应该知道的东西。总的来说,我会保留这两种解决方案,以便向用户演示。@Benji--FYI--作为另一种解决方案,在性能计时测试方面,显示以下简单Python循环的运行速度比Numpy代码快几倍:
    sum(如果我<2岁,年轻一岁;如果我在范围内,老年一岁(狗年))
    @DarryIG感谢您分享这个简洁明了的解决方案!关于绩效,您是否有具体的参考资料?我刚刚做了一个计时测试,python对于小于~100的值速度更快,但从~1000 numpy开始,它的性能远远优于python。所以,考虑到这个将狗的年龄变成人类年龄的特殊用例,我承认你是对的。@DarryIG这是运行时行为的一个很好的比较!非常感谢。测试2完美地展示了我在写其他评论时所考虑的内容。然而,我想指出,测试1有一个相当明显的结果,因为每个测试函数都只是一个调用常量时间函数的for循环,所以由于python的for循环,运行时间的增加是线性的。如果用NumPy功能替换for循环调用
    calc\u np(years)
    ,NumPy的美妙之处将胜过普通Python。@Benji——对于测试1——随机年龄在0-25岁之间,平均值为12.5,因此您希望平均有这么多for循环。在这个水平上,Numpy是最差的,如测试2所示。Numpy的有趣之处在于性能相对平稳(只是缓慢增加)。这指出了一些固定的开销,这使得它只适用于较大的问题规模(即在这种情况下,循环超过100次)。这就是您在Numpy中经常看到的情况——对于更大的问题,它通常只比纯Python好。因此,除非您正在进行复杂的计算,否则纯Python通常会更好。