Python练习:正数相加
Python练习:正数相加
题目
得到一个数字数组,返回所有正数的总和。
示例 [1,-4,7,12]
=> 1 + 7 + 12 = 20
注意:如果没有要求和的内容,则默认求和为 0
。
代码
def positive_sum(arr):
sum = 0
for x in arr:
if x >0:
sum += x
return sum
def positive_sum(arr):
return sum(x for x in arr if x > 0)
知识点:
函数定义:
def positive_sum(arr):
定义了一个名为positive_sum
的函数,该函数接受一个参数arr
。生成器表达式:
x for x in arr if x > 0
是一个生成器表达式。这是一种非常强大的Python特性,它允许你在一行代码中生成一个迭代器,这个迭代器可以产生一系列满足特定条件的元素。在这个例子中,生成器表达式产生arr
中所有大于0的元素。内置函数:
sum()
是Python的一个内置函数,用于计算所有数值的和。在这个例子中,它计算的是由生成器表达式产生的所有正数的和。返回语句:
return sum(x for x in arr if x > 0)
是一个返回语句,它定义了函数的返回值。在这个例子中,函数返回的是arr
中所有正数的和。
测试
import codewars_test as test
from solution import positive_sum
@test.describe("positive_sum")
def fixed_tests():
@test.it('Basic Test Cases')
def basic_test_cases():
test.assert_equals(positive_sum([1,2,3,4,5]),15)
test.assert_equals(positive_sum([1,-2,3,4,5]),13)
test.assert_equals(positive_sum([-1,2,3,4,-5]),9)
@test.it("returns 0 when array is empty")
def empty_case():
test.assert_equals(positive_sum([]),0)
@test.it("returns 0 when all elements are negative")
def negative_case():
test.assert_equals(positive_sum([-1,-2,-3,-4,-5]),0)
列表推导式VS生成器表达式
两者的主要区别在于,列表推导式会立即生成一个完整的列表,而生成器表达式则会返回一个生成器,这个生成器会在每次请求时生成一个元素,而不是一次性生成所有元素。
具体来说,如果你使用方括号将 "x for x in arr if x > 0" 括起来,那么它就是一个列表推导式,会立即生成一个包含所有正数的列表:
[x for x in arr if x > 0]
而如果你使用圆括号将它括起来,或者直接将其作为函数参数(如 sum 函数),那么它就是一个生成器表达式,会返回一个生成器:
(x for x in arr if x > 0) # 生成器表达式
sum(x for x in arr if x > 0) # 生成器表达式作为函数参数
生成器表达式的优点是,它在内存使用上更加高效,特别是当你需要处理大量数据时。因为它不需要一次性生成所有元素,而是在每次请求时生成一个元素。
License:
CC BY 4.0