我的代码解决了这个问题吗?我是python的初学者

我的代码解决了这个问题吗?我是python的初学者,python,Python,编写一个程序,生成100个随机数,并记录这些随机数中有多少是偶数,有多少是奇数 import random def main(): print("There",even(),"even numbers\n") print("There",odd(),"even numbers") def even(): even_count=0 for i in range(0,100): x= random.randint(1,100)

编写一个程序,生成100个随机数,并记录这些随机数中有多少是偶数,有多少是奇数

import random 

def main():
    print("There",even(),"even numbers\n")
    print("There",odd(),"even numbers")        

def even():
     even_count=0
     for i in range(0,100):
        x= random.randint(1,100)# genreates random numbers 
        if (x % 2) == 0:#finds odd numbers
            even_count += 1 #keeps count of even  numbers
     return even_count 

def odd():
    odd_count=0
    for i in range(0,100):
        x= random.randint(1,100)# genreates random numbers 
        if (x % 2) != 0: #finds odd numbers
            odd_count+=1 #keeps count of odd numbers
    return odd_count   

假设你应该在同一袋数字中计算偶数和赔率,那么就不算了,因为你没有为每个函数计算相同的集合

i、 你要生成100个数字并计算其中有多少是偶数,然后再生成100个新数字并计算其中有多少是奇数


你甚至需要单独的功能吗?一个数字可以不是偶数或奇数吗?

是,也可以不是。从技术上讲,你可以生成200个随机数

由于您调用
偶数()
,它会生成100,然后
奇数()
它也会生成100+100=200

您可以这样做:

from random import randint

even = sum(randint(0, 100) % 2 == 0 for _ in range(0, 100))
odd = 100 - even

print('{} Even, {} Odd'.format(even, odd)
另一种稍微快一点的方法是惰性跟踪器。它基本上存储顺序生成的编号(即
range()
),而不是随机生成的编号。由于您不关心生成的数字,我们只使用顺序生成的计数作为理解中成功条件的数量:

even = len([x for x in range(0, 100) if randint(0, 100) % 2 == 0])
odd = 100 - even

这种方法快了几秒钟,因为与
sum()
不同,我们不必返回并计算
True
出现的次数(将
sum()
视为
1
)。因此,我们存储我们所处范围内的任何数字,并让
list.length
的本机列表属性在此过程中得到更新。成功存储的数量是生成的偶数值的数量。

对于
偶数
奇数
数字,您不需要这些单独的方法,而只需为这两个数字保留一个
计数器

import random

even_count = 0
odd_count = 0

for i in range(0,100):
    x = random.randint(1,100)# genreates random numbers
    if (x % 2) != 0:  # finds odd numbers
        odd_count += 1
    else:
        even_count += 1
print("There are {} even and {} odd numbers.".format(even_count, odd_count))
输出

There are 51 even and 49 odd numbers.

修改你的方法。您只需要一个功能:

import random 

def main():
    even,odd = generator()
    print("There are ",even," even numbers\n")
    print("There are ",odd," odd numbers")        

def generator():
    even_count = 0
    odd_count = 0
    for i in range(0,100):
        x= random.randint(1,100)# genreates random numbers 
        if (x % 2) == 0: #finds odd numbers
           even_count += 1 #keeps count of even  numbers
        else:
           odd_count += 1 #keeps count of odd numbers
    return even_count,odd_count

main()

希望这能回答你的问题

我将如何做,尽可能地从代码中消除麻烦,如果您重复代码,您可以使其更简单

import random

def main():
    random_numbers = [random.randrange(1, 101) for i in range(100)]
    print(f'There are {len([x for x in random_numbers if x % 2 >= 1])} even numbers.\n'
          f'There are {len([x for x in random_numbers if x % 2 == 0])} odd numbers.')

main()

# There are 45 even numbers.
# There are 55 odd numbers.

在一行中,您的问题可以表示为
count=len(过滤器(谓词,值))
实施这一目标:

from random import randint

count = len(filter(lambda _: randint(1,100)%2 == 0, range(100)))
print '{0} even, {1} odd.'.format(count, 100-count)
尽管在实践中,您可能应该将程序分解为中间步骤,以提供在算法中有用的中间值

def is_even(x):
    return x % 2 == 0

def is_odd(x):
    return x % 2 == 1

values = [randint(1,100) for _ in range(100)]

evens = filter(is_even, values)
odds = filter(is_odd, values)

print '{0} even, {1} odd.'.format(len(evens), len(odds))
产出:

47 even, 53 odd.
53 even, 47 odd.

您正在创建200个数字。 您可以在一个函数中完成此操作

import random 

def main():
    odd , even = odd_or_even()
    print("There",even,"even numbers\n")
    print("There",odd,"even numbers")

def odd_or_even():
     even_count=0
     odd_count=0
     for i in range(0,100):
        x= random.randint(1,100)# genreates random numbers 
        if (x % 2) == 0:#finds odd numbers
            even_count += 1 #keeps count of even  numbers
        else:
            odd_count+=1 #keeps count of odd numbers

     return odd_count, even_count 

我将您的代码压缩成一个较小的脚本,因为一开始有很多不必要的代码。另外,您的代码肯定回答了这个问题。 随机输入 从随机导入randint

def main():
     even_count=0
     odd_count = 0
     for i in range(0,100):
        x = randint(1,100)# genreates random numbers 
        if (x % 2) == 0:#finds odd numbers
            even_count += 1 #keeps count of even  numbers
        else:
            odd_count += 1
     print(even_count)
     print(odd_count)
main()

你好请具体说明您面临的问题,并粘贴您看到的任何错误消息。您的解决方案将调用偶数()生成100个数字,而奇数()也将生成100个数字。你想单独生成随机数还是只生成一次?你可能希望偶数和奇数加起来是100。如果你从两个不同的数字列表中计算赔率和偶数,情况就不会是这样了。因此,首先生成数字。然后计算赔率,你可以通过减法算出偶数。只需调用
偶数()
,然后将结果从100中减去,就可以算出奇数。您不需要使用
odd()
方法。不需要创建一个列表来计算它的len。do
偶数=sum(randint(01100)%2==0表示范围(01100))
@Jean-Françoisfare非常正确。事实上,我最初的帖子总是把
变成偶数
100,因为它包含100个布尔值。使用列表需要一个嵌套表达式。@Jean-Françoisfare实际上,请参阅我的更新。有时比
sum()
稍快一些,因为
len()
是常数时间,我们不关心随机生成的数字是什么。你做了吗?因为创建一个列表是昂贵的
len
不是问题,但您首先要创建一个列表。我敢肯定,如果你把那
sum
wins@Jean-弗朗索瓦·法布雷·耶伊坐在板凳上,
sum
每输10-15秒;使用
timeit.timeit()
。我必须运行更多的测试,但似乎因为
sum
必须返回,所以构建列表的追加操作比
sum
迭代时稍微优化一些。当然,情况并非总是如此,因为有时
sum
更快。取决于生成了多少“随机”偶数。无论如何,我仍然认为
sum
更好,因为它是一个生成器表达式。您的代码调用
奇数或偶数()
两次,这是不需要的。更新:即使您做了更改,您也要对容器进行两次迭代,只需执行一次。@pstatix是的,我意识到:P修复了它,现在它只是一个函数。您和我的区别在于,如果需要访问奇数和偶数,实际上存在一个奇数和偶数列表,你只是从100中减去,得到可能的余数。所以这取决于你想做什么。OP要求生成一组100个数字。因此,如果你计算出这100人中有23人是偶数,剩下的77人是奇数。我建议你重读这篇文章,并相应地更新你的解决方案。
def main():
     even_count=0
     odd_count = 0
     for i in range(0,100):
        x = randint(1,100)# genreates random numbers 
        if (x % 2) == 0:#finds odd numbers
            even_count += 1 #keeps count of even  numbers
        else:
            odd_count += 1
     print(even_count)
     print(odd_count)
main()