在 Python 中计算 10 位数字中零、奇数和偶数的数量?

Counting the number of zeroes, odds, and evens in a 10-digit number in Python?

integer = int(raw_input("Enter a ten-digit number please: "))

zero_count = 0
even_count = 0
odd_count = 0

def digit_count(x):
    while x > 0:
        if x % 10 == 0:
            zero_count += 1
        elif x % 2 == 0:
            even_count += 1
        else:
            odd_count += 1
        x / 10

    print zero_count
    print even_count
    print odd_count

print digit_count(integer)

用户输入一个十位整数,然后输出应该是其中的奇数、偶数和零的个数。当我运行它时,目前它只让我输入一个整数,然后什么都不做。

您的代码中存在一些缺陷:

integer = int(raw_input("Enter a ten-digit number please: "))

zero_count = 0
even_count = 0
odd_count = 0


def digit_count(x):
    global zero_count,even_count,odd_count
    while x > 0:
        num = x%10  # store the last digit of x
        if  num % 10 == 0:
            zero_count += 1
        elif num % 2 == 0:
            even_count += 1
        else:
           odd_count += 1
        x /= 10

digit_count(integer)       # you need to call the function 1st
print zero_count
print even_count
print odd_count

那是因为您没有在 'while' 的每次迭代后重新分配 x 值。

只需将无任何作用的 x/10 更改为 x = x/10

还有

您的声明:

zero_count = 0
even_count = 0
odd_count = 0

在您的函数之外。因此,您将收到 'referenced before assignment' 错误,除非您:

  1. 在您的 digit_count 函数中将它们声明为 nonlocal。通过
nonlocal zero_count
nonlocal even_count
nonlocal odd_count

如果您正在使用 Python 2,是否需要使用 'global' 而不是非本地。

  1. 在您的函数中初始化它们

为了您的特定目的,我认为在您的函数中声明和初始化它们的第二种选择更有意义。你只需要在函数内部使用它们。

正如其他人提到的,它应该是x = x / 10,但你还需要使你的计数器变量global

此外,

print digit_count(integer)

会显示None。由于零、奇数和偶数的打印是在 digit_count() 中执行的,因此您不需要额外的 print.

另一种方法是将 Counter 应用于映射输入:

from collections import Counter

s = raw_input("Enter a ten-digit number please: ")
c = Counter('zero' if d == '0' else ('odd' if int(d)%2 else 'even') for d in s)
print "zeros {}, odd {}, even {}".format(c['zero'], c['odd'], c['even'])

您的代码中存在范围界定问题。零、偶数和奇数是全局变量,它们在函数内被修改。而且,您在语句 x = x / 10 中缺少赋值。

我不想通过除以 10 来处理大整数,而是想强调一种替代方法。首先将你的字符串转换成个位数的列表,然后通过digit_count函数对列表进行处理:

def digit_count(digits):
    """ Takes a list of single digits and returns the 
        count of zeros, evens and odds
    """
    zero_count = 0
    even_count = 0
    odd_count = 0
    for i in digits:
        if i == 0:
            zero_count += 1
        elif i % 2 == 0:
            even_count += 1
        else:
            odd_count += 1
    return zero_count, even_count, odd_count

inp = raw_input("Enter a ten-digit number please: ")
digits = [int(i) for i in inp] # see comment at the bottom of the answer

zero_count, even_count, odd_count = digit_count(digits)

print('zero_count: %d' % zero_count)
print('even_count: %d' % even_count)
print('odd_count: %d' % odd_count)

我的代码需要注意的是它将计算前导零。虽然您的方法不会计算前导零。 要获得 exact 行为作为您的代码,请替换行

digits = [int(i) for i in inp]

digits = [int(i) for i in  str(int(inp))]

来自 collections.Counter

  1. 根据用户输入创建了计数器字典。
  2. 我们知道2,4,6,8是偶数,3,5,7,9是奇数。因此,将所有偶数位的值相加得到偶数,所有奇数位相加得到奇数。

代码:

from collections import Counter
digit_counter = Counter(map(lambda x: int(x), raw_input("Enter a ten-digit number please: ")))

print "Zero count",  digit_counter[0]
print "Even count", digit_counter[2]+digit_counter[4]+digit_counter[6]+digit_counter[8]
print "Odd count", digit_counter[1]+digit_counter[3]+digit_counter[5]+digit_counter[7]+digit_counter[9]

输出:

python test.py 
Enter a ten-digit number please: 0112203344
Zero count 2
Even count 4
Odd count 4

使用 Python 3 你可以做得更好。

from collections import Counter
#s = '03246'
s = str(input ("Enter number --> "))
c = Counter('zero' if d == '0' else ('odd' if int(d)%2 else 'even') for d in s)
print("Zero --> " ,c['zero'], "Odd--> ", c['odd'],"Even-->", c['even'])