2015-03-19 2 views
0

Я создал код, который в основном генерирует случайное 20-значное число. Код ниже:Pingon counting zeros

import random 
from random import randint 

n=20 

def digit(n): 

    range_start = 10**(n-1) 
    range_end = (10**n)-1 
    return randint(range_start, range_end+1) 


print(digit(n)) 

Вывод этого кода для примера:

49690101904335902069 

Теперь дал этот код, я просто интересно, как я могу идти о к подсчету числа нулей на выходе, так что по существу я пытаюсь создать новую функцию под названием count_zero():, но я понятия не имею, что ее поставить для моего параметра, а что нет.

+1

У вас есть ошибка за один раз в генерации цифр; используйте 'range_end' в randint(); конечное значение * включено *. –

ответ

8

Turn число в строку и подсчитать количество '0' символов:

def count_zeros(number): 
    return str(number).count('0') 

Демо:

>>> def count_zeros(number): 
...  return str(number).count('0') 
... 
>>> count_zeros(49690101904335902069) 
5 

Или не превращая его в строку:

def count_zeros(number): 
    count = 0 
    while number > 9: 
     count += int(number % 10 == 0) 
     number //= 10 
    return count 

последний подход - лот slower howe версия:

>>> import random 
>>> import timeit 
>>> test_numbers = [random.randrange(10 ** 6) for _ in xrange(1000)] 
>>> def count_zeros_str(number): 
...  return str(number).count('0') 
... 
>>> def count_zeros_division(number): 
...  count = 0 
...  while number > 9: 
...   count += int(number % 10 == 0) 
...   number //= 10 
...  return count 
... 
>>> timeit.timeit('[c(n) for n in test_numbers]', 
...  'from __main__ import test_numbers, count_zeros_str as c', number=5000) 
2.4459421634674072 
>>> timeit.timeit('[c(n) for n in test_numbers]', 
...  'from __main__ import test_numbers, count_zeros_division as c', number=5000) 
7.91981315612793 

Чтобы совместить это с кодом, просто добавить функцию, и вызов отдельно; вы можете передать в результате digit() непосредственно или сохранить результат первого, а затем передать его в:

print(count_zeros(digit(n))) 

или отдельно (который позволяет показать получившийся случайное число тоже):

result = digit(n) 
zeros = count_zeros(result) 
print('result', result, 'contains', zeros, 'zeros.') 
+0

любой способ сделать это без преобразования в строку? 'from itertools import Counter' does not work – letsc

+1

@letsc: ничего * быстрее *, нет. –

+0

просто хотел уточнить, какой аргумент числа вы положили внутри функции? – Giovanni