【问题标题】:Check if a number is odd or even in Python [duplicate]在 Python 中检查数字是奇数还是偶数 [重复]
【发布时间】:2023-01-20 23:56:54
【问题描述】:

我正在尝试制作一个程序来检查一个单词是否是回文,到目前为止我已经做到了并且它适用于具有偶数个数字的单词。如果字母的数量是奇数,我知道如何让它做某事,但我只是不知道如何找出数字是否是奇数。有什么简单的方法可以判断一个数是奇数还是偶数?

仅供参考,这是我的代码:

a = 0

while a == 0:
    print("\n \n" * 100)
    print("Please enter a word to check if it is a palindrome: ")
    word = input("?: ")

    wordLength = int(len(word))
    finalWordLength = int(wordLength / 2)
    firstHalf = word[:finalWordLength]
    secondHalf = word[finalWordLength + 1:]
    secondHalf = secondHalf[::-1]
    print(firstHalf)
    print(secondHalf)

    if firstHalf == secondHalf:
        print("This is a palindrom")
    else:
        print("This is not a palindrom")


    print("Press enter to restart")
    input()

【问题讨论】:

  • 我不知道您如何用 Python 表达这一点,但是如果单词的字符数为奇数,则 (wordlength mod 2)== 1 将为真。

标签: python


【解决方案1】:
if num % 2 == 0:
    pass # Even 
else:
    pass # Odd

% 符号就像除法一样,只是它检查余数,因此如果数字除以 2 的余数为 0,则它甚至是奇数。

或者将它们反转以提高一点速度,因为任何大于 0 的数字也被认为是“真”,您可以跳过需要进行任何相等性检查:

if num % 2:
    pass # Odd
else:
    pass # Even 

【讨论】:

  • 0(零)在 python 中被认为是偶数还是在条件中需要单独的(或)语句?例如如果 num % 2 == 0: 或 num == 0
  • 0 将被视为偶数。由于 0/2 = 0 余数 0,所以 0%2 为 0
  • 从数学上讲 0 是偶数。 en.wikipedia.org/wiki/Parity_of_zero
  • 上面的方法有效,底部的方法对我不起作用
  • 这个视频也解释的很好:youtu.be/LlF4ejAZ92g
【解决方案2】:

与其他语言类似,最快的“模 2”(奇数/偶数)运算是使用 bitwise and 运算符完成的:

if x & 1:
    return 'odd'
else:
    return 'even'

使用按位与运算符

  • 想法是检查是否数字的最后一位是否设置.如果设置最后一位则数字为奇数,否则甚至。
  • 如果一个数字是奇数&(按位与)与 1 的数字将为 1,因为最后一位已经设置。否则它将给出 0 作为输出。

【讨论】:

  • “显式优于隐式。简单优于复杂。”,来自 Python 之禅
  • 因为num % 2num & 1更明确? Python 没有内置的odd() 函数,因此除非您自己编写,否则您不会得到比这更明确的函数,在这种情况下,您使用哪种方法来实现它仍然无关紧要。
  • 我认为@MaximeLorant 指的是按位和操作是一种模糊的方式来做到这一点,尽管速度很快。如果您不追求速度,模运算是最清晰的方法。
  • 没错@Puff。模运算符在此类用例中广为人知,而数字的按位运算符并不常见。另外,这两种解决方案在我的 PC 上似乎以相同的速度运行(使用 timeit.timeit('a = random.randint(1, 1000); a & 1', setup='import random', number=1000000),我得到 1.1109 的按位和 1.1267 的模......)我仍然同意我 2014 年的评论,万岁:-)
  • 这很有趣,因为我也尝试过使用 timeit 运行它。我相信,由于 python 将数字包装为对象,因此底层代码可能没有针对 AND 操作进行优化。通过使用汇编,我知道按位 AND 比模运算(使用除法并获取余数寄存器)更快(到目前为止)。这可以用其他语言进行测试。我不同意明确和可读......但对于新手来说也许更容易理解。
【解决方案3】:

单词的字母数量是偶数还是奇数并不重要:

def is_palindrome(word):
    if word == word[::-1]:
        return True
    else:
        return False

【讨论】:

  • 为什么不只是return word == word[::-1]?如果条件为 True 则返回 True,如果条件为 false 则返回 False,与返回条件相同...
  • @Hyperboreus 只是想尽可能明确,因为我觉得 OP 对 Python 来说是非常新的。
  • 这一个在简单性和清晰性方面胜过我自己的笨拙解决方案!
【解决方案4】:

最简单的方法之一是使用去模运算符 %。如果 n % 2 == 0,那么你的数字是偶数。

希望能帮助到你,

【讨论】:

    【解决方案5】:

    使用modulo operator

    if wordLength % 2 == 0:
        print "wordLength is even"
    else:
        print "wordLength is odd"
    

    对于您的问题,最简单的方法是检查单词是否等于其颠倒的兄弟。您可以使用 word[::-1] 来做到这一点,它从 word 创建列表,方法是获取从末尾到开头的每个字符:

    def is_palindrome(word):
        return word == word[::-1]
    

    【讨论】:

      【解决方案6】:

      奇数词的中间字母与判断该词是否回文无关。忽略它。

      暗示:您所需要的只是对以下行进行轻微调整,以使其适用于所有字长:

      secondHalf = word[finalWordLength + 1:]
      

      附言如果你坚持要分别处理这两种情况,if len(word) % 2: ... 会告诉你这个词有奇数个字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-12
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2015-03-03
        • 2016-09-23
        相关资源
        最近更新 更多