编写一个接受整数列表作为参数的函数。您的函数应返回列表中所有奇数的总和。如果列表中没有奇数,则函数应返回0作为总和。
def odd_numbers (my_list):
total = 0
count = 0
for number in my_list:
if (number % 2 == 1):
total = total + number
else:
count = count + 1
if (number == count):
return (0)
else:
return (total)
#Main Program
my_list = []
n = int(input("Enter the maximum length of a list: "))
while (len(my_list) < n):
item = input ("Enter integer value to the list: ")
my_list.append(item)
print ("This is your list: ", my_list)
result = odd_numbers(my_list)
print (result)
这是我的计划。当我执行它时,如果函数odd_numbers中的条件和我从主程序调用函数时,首先出现错误。我无法理解这个错误的本质。它只是声明
TypeError:并非在字符串格式化期间转换所有参数
答案 0 :(得分:3)
问题是:当你做
时item = input("Enter integer value to the list: ")
item
是一个字符串。它存储在一个列表中,传递给odd_numbers()
,当你到达 p>时
if (number % 2 == 1):
当它看到str % something
时,它会尝试应用旧式字符串格式(例如,"%04d" % 3
会导致"0003"
)。但是你的字符串没有任何格式说明符(没有"%"
字符),所以它抱怨说有更多的参数而不是放置它们的地方; - )
为避免这种情况,请确保将字符串转换为数字,即
item = int(input("Enter integer value to the list: "))
一个有点愚蠢的解决方案:
def sum_of_odd_numbers(lst):
return sum((i*(i%2) for i in lst), 0)
或更易读的,
def sum_of_odd_numbers(lst):
return sum((i for i in lst if i%2), 0)
或功能等同物,
def sum_of_odd_numbers(lst):
return sum(filter(lambda x: x%2, lst), 0)
答案 1 :(得分:2)
一个。 raw_input
返回值的数据类型为string
,因此需要类型转换
>>> item = raw_input("Enter Number:")
Enter Number:2
>>> type(item)
<type 'str'>
>>> item = int(raw_input("Enter Number:"))
Enter Number:4
>>> type(item)
<type 'int'>
>>>
B中。类型转换期间的异常处理:如果用户从数字输入任何其他字符,则上面的代码将引发需要处理的ValueError
异常。
e.g。
>>> item = int(raw_input("Enter Number:"))
Enter Number:w
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'w'
带有异常处理的演示:
>>> try:
... item = int(raw_input("Enter Number:"))
... except ValueError:
... print "Enter only digits."
...
Enter Number:rt
Enter only digits.
℃。 与实际算法相关
一个。不需要count
变量逻辑。
湾
期间无需if
循环。
℃。最好将功能编号更改为sumOfOddNumbers
,即更有意义。
演示:
def sumOfOddNumbers (numbers_list):
total = 0
for number in numbers_list:
if (number % 2 == 1):
total += number
return total
d。在其他答案中使用list comprehension,sum方法,lambda函数
电子。 时间运行以下代码:
lst = range(10000000)
def sum_of_odd_numbers1():
return sum((i*(i%2) for i in lst), 0)
def sum_of_odd_numbers2():
return sum((i for i in lst if i%2), 0)
def sum_of_odd_numbers3():
return sum(filter(lambda x: x%2, lst), 0)
def sumOfOddNumbers ():
total = 0
for number in lst:
if (number % 2 == 1):
total += number
return total
import time
start_time = time.time()
sum_of_odd_numbers1()
end_time = time.time()
print "Timing of sum_of_odd_numbers1:", end_time - start_time
start_time = time.time()
sum_of_odd_numbers2()
end_time = time.time()
print "Timing of sum_of_odd_numbers2:", end_time - start_time
start_time = time.time()
sum_of_odd_numbers3()
end_time = time.time()
print "Timing of sum_of_odd_numbers3:", end_time - start_time
start_time = time.time()
sumOfOddNumbers()
end_time = time.time()
print "Timing of sumOfOddNumbers:", end_time - start_time
各自的输出:
vivek:~$ python /home/vivek/workspace/vtestproject/study/timer.py
Timing of sum_of_odd_numbers1: 2.4171102047
Timing of sum_of_odd_numbers2: 1.73781108856
Timing of sum_of_odd_numbers3: 2.09230113029
Timing of sumOfOddNumbers: 1.42781090736
答案 2 :(得分:2)
试试这段代码:
def read_int(msg):
n = None
while n is None:
try:
n = int(input(msg))
except ValueError:
print("You should enter only integer values!")
return n
def odd_numbers (my_list):
total = 0
count = 0
for number in my_list:
if (number % 2 == 1):
total = total + number
else:
count = count + 1
if (number == count):
return (0)
else:
return (total)
#Main Program
my_list = []
n = read_int("Enter the maximum length of a list: ")
while (len(my_list) < n):
item = read_int("Enter integer value to the list: ")
my_list.append(item)
print ("This is your list: ", my_list)
result = odd_numbers(my_list)
print (result)
答案 3 :(得分:1)
您的代码适用于Python 2.7但不支持Python 3.x,因为input
函数在Python 3中返回一个字符串。更改
item = input("Enter integer value to the list: ")
到
item = int(input("Enter integer value to the list: "))
话虽如此,您还可以缩短您的职能:
def odd_numbers (my_list):
total = 0
for number in my_list:
if (number % 2 == 1):
total = total + number
return (total)
在Python中了解列表推导/生成器表达式后,您还可以使用@minitoto提供的生成器方法进行更优化。
答案 4 :(得分:1)
试试这个:
def odd_number(list_):
odd_nums = [nums for nums in list_ if nums % 2 != 0]
if odd_nums:
return sum(odd_nums)
else:
return 0
my_list = range(10)
print (odd_number(my_list))
答案 5 :(得分:1)
理解是一种简洁的语法;为了完整性,还要考虑这个递归函数,
def f(xs):
if xs == []:
return 0
else:
v = 0 if xs[0] % 2 == 0 else xs[0]
return v + f(xs[1:])
此函数终止,因为它会在每次递归调用时将列表减少一个元素直到空列表。