【问题标题】:Check if a number is odd or even in python [duplicate]检查python中的数字是奇数还是偶数[重复]
【发布时间】:2014-02-17 19:03:07
【问题描述】:

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

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

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 

【讨论】:

  • is 0(Zero) 在python中被认为是偶数,还是在条件中需要单独的(或)语句?例如如果 num % 2 == 0: 或 num == 0
  • 0 将被视为偶数。由于 0/2 = 0 余数为 0,所以 0%2 为 0
  • 从数学上讲,0 是偶数。 en.wikipedia.org/wiki/Parity_of_zero
【解决方案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]?条件为真返回真,条件为假返回假,与返回条件相同...
  • @Hyperboreus 只是想尽可能明确,因为我觉得 OP 对 Python 来说非常新。
  • 这个解决方案在简单性和清晰度方面都胜过我自己的笨拙解决方案!
【解决方案4】:

使用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]

【讨论】:

    【解决方案5】:

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

    希望对你有帮助,

    【讨论】:

      【解决方案6】:

      奇数长度单词的中间字母与确定该单词是否为回文无关。无视就好。

      提示:您只需对以下行稍作调整即可使其适用于所有字长:

      secondHalf = word[finalWordLength + 1:]
      

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

      【讨论】:

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