【问题标题】:Only allowing a loop of odd numbers in a function只允许在函数中循环奇数
【发布时间】:2017-02-05 03:14:08
【问题描述】:

我正在自学python,但我真的被这个问题困住了。它要求“编写一个接受奇数列表作为输入的函数。遍历奇数列表并将每个变成偶数。将每个偶数存储在一个新列表中并返回该新列表。”

我对问题的后半部分感到满意​​,但在只允许输入为奇数时苦苦挣扎。

这是我到目前为止所写的,它适用于您提交的任何奇怪的列表,例如([1,3,5]) 并且当您以偶数开头时它会起作用,例如([2,3,5]) 但是当偶数在列表的中间时我无法让它工作,例如([1,2,3]) - 我希望它打印这是无法完成的。

def odd_to_even(x):
for i in x:
    if i %2 == 0:
        print('This is not an odd number')
        break
    else:
        list = []
        for n in x:
            list.append(n -1)
        return list

【问题讨论】:

  • 为什么需要处理这种情况?规范说你得到一个奇数列表,所以你可以假设它总是正确的,除非它被要求你拒绝。此外,您还发生了奇怪的双循环(for i in xfor n in x)。
  • 这有点取决于你如何解释“接受”这个词。这包括“拒绝”吗?
  • FWIW:if any(i % 2 == 0 for i in x): raise ValueError
  • @deceze 我会说只有当它说 "only 接受"
  • 顺便说一句,你不应该使用 list 作为变量名,因为它会隐藏内置的 list 类型。这样做不是错误(因此 Python 不会打印错误消息),但它会使其他阅读您的代码的人感到困惑,并且可能导致 导致打印神秘错误消息的错误.

标签: python list function for-loop


【解决方案1】:

我同意 @jonrsharpe、@ShadowRanger 和 @deceze 的 cmets 的观点,即您可能不需要包括测试,但这不会造成伤害。我将在此处使用@deceze 的行进行检查。请记住,您必须使用它在循环外部声明您的列表,否则循环将在每次迭代时重置它。最好更改名称以使事情更清晰。

def odd_to_even(input_list):
    if any(i % 2 == 0 for i in input_list): raise ValueError
    output_list = []
    for i in input_list:
        output_list.append(i - 1)
    return output_list

合并@deceze 的优秀单行代码并保持验证:

def odd_to_even(input_list):
    if any(i % 2 == 0 for i in input_list): raise ValueError
    return [i - 1 for i in input_list]

您在评论中询问了双循环有什么奇怪之处,所以我想在这里添加一个小解释。有时您希望在循环中有一个循环,但这不是其中一种情况。你有一个列表,在这种情况下循环一次就足够了:

  1. 确定列表中的所有数字是否都是奇数(验证列表)
  2. 获取每个数字,对其进行修改,然后将其添加到您的输出列表中

通过在第一个循环中循环第二次,每次循环遍历列表时,最终都会遍历列表。也许这个措辞令人困惑。假设您的输入列表是[1, 3, 5]。通过在循环中使用循环,您最终会创建一个新列表以输出 3 次,因为您将为输入中的每个项目创建一次输出。希望对您有所帮助。

【讨论】:

  • 这可能不适合初学者,但是……return [i - 1 for i in x]……
  • 或者如果你想同时接受奇数和偶数,并确保它们在你返回时是偶数(通过偶数不是错误,它们只是保持不变):return [i & ~1 for i in x]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多