This was the question:
Write a function called sum_range that accepts 2 integer values as
parameters and returns the sum of all the integers between the two
values, including the first and last values. The parameters may be in
any order (i.e. the second parameter may be smaller than the first).
For example:result = sum_range(1, 1)
print(result) 1result = sum_range(2, 4) print(result) 9
result = sum_range(3, 2)
print(result) 5
my codes are as below, I dont know where it went wrong
but when I test the codes, it returned ‘none’ when (2,4) (3,2) were entered
def sum_range(x,y):
if x == y:
return x
if x<y:
sum(range(x,y))
return
if x>y:
sum(range(y,x))
return
asked Jul 31, 2014 at 10:50
7
You could do better (at least I think), here is my code for that:
def sum_range(a, b):
return sum(range(min(a,b),max(a,b)+1))
answered Jul 31, 2014 at 10:58
ex0nsex0ns
1,1168 silver badges18 bronze badges
1
You were very close but forgot to return the actual value from the calculations. If you just type «return», you will return None and not the result from the sum.
You also did not include the last number in the range in the sum. See corrected code below:
def sum_range(x, y):
if x == y:
return x
if x < y:
return sum(range(x, y+1))
if x > y:
return sum(range(y, x+1))
answered Jul 31, 2014 at 10:57
4
You need to return the sum which you are not doing in the x<y
and x>y
cases. You should
return sum(range(x,y))
or return sum(range(y,x))
as appropriate.
Note also that there is a bug in your range()
expressions — «including the first and last values». Hint: What does range(1,3)
output?
answered Jul 31, 2014 at 10:58
mhawkemhawke
83.9k9 gold badges115 silver badges136 bronze badges
def sum_range(x,y):
if x == y:
return x
elif x < y:
s = 0
for i in range(x,y):
s += x+(x+1)
return s
elif x > y:
s = 0
for i in range(y,x):
s += y+(y+1)
return s
This is done without using sum() function.
answered Jul 31, 2014 at 11:14
SeshaSesha
2021 silver badge5 bronze badges
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
There are numerous ways to initialize the list with the elements, but sometimes, its required to initialize the lists with the numbers in a sliced way and find its summation. This can be custom and hence knowledge of this can come handy. Let’s discuss certain ways in which this can be done.
Method #1 : Using list comprehension + enumerate() + sum() The list comprehension can do the possible iteration part and enumerate can help in the part of logic and checking for the valid elements required in the list. The sum() is used to perform summation.
Python3
test_list
=
list
(
range
(
50
))
print
("The original
list
is
: "
+
str
(test_list))
N
=
5
K
=
15
res
=
sum
([i
for
j, i
in
enumerate
(test_list)
if
j
%
K < N ])
print
("The modified
range
sum
list
: "
+
str
(res))
Output :
The original list is : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] The modified range sum list : 490
Time Complexity: O(n) where n is the number of elements in the list “test_list”. The list comprehension + enumerate() + sum() is used to perform the task and it takes O(n) time.
Auxiliary Space: O(n) additional space of size n is created where n is the number of elements in the list “test_list”.
Method #2 : Using itertools.compress() + itertools.cycle() + sum() The above two function can combine to facilitate the solution of the discussed problem. The cycle function can to the task of repetition and the compress function can be beneficial when it comes to clubbing the segments together. The sum() is used to perform summation.
Python3
from
itertools
import
compress, cycle
test_list
=
list
(
range
(
50
))
print
("The original
list
is
: "
+
str
(test_list))
N
=
5
K
=
15
func
=
cycle([
True
]
*
N
+
[
False
]
*
(K
-
N))
res
=
sum
(
list
(compress(test_list, func)))
print
("The modified
range
sum
list
: "
+
str
(res))
Output :
The original list is : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] The modified range sum list : 490
Time Complexity: O(n*n), where n is the number of elements in the list “test_list”.
Auxiliary Space: O(1), constant extra space is required
Last Updated :
07 May, 2023
Like Article
Save Article
Числовой диапазон (range) — упорядоченная последовательность целых чисел с заданным шагом.
Синтаксис функции range выглядит так:
range([start], stop[, step])
start
— число начала последовательности (по умолчанию 0).
stop
— число конца последовательности.
step
— шаг между каждым числом последовательности.
Параметры start
и step
— не обязательные, если их не указывать, то последовательность будет создаваться от 0 до stop
с шагом 1.
Также следует помнить, что:
- Все параметры функции
range
должны быть целыми числами. - Параметры могут быть отрицательными числами.
- Если шаг
step
отрицательный, нужно помнить, что значениеstart
должно быть больше значенияstop
. - Параметр
stop
не включается в последовательность.
Для генерации будем использовать различные комбинации:
my_list = list(range(10)) print(my_list) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list = list(range(5, 10)) print(my_list) #[5, 6, 7, 8, 9]
my_list = list(range(5, 10, 2)) print(my_list) #[5, 7, 9]
my_list = list(range(0, -10, -1)) print(my_list) #[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
Генерация списка в цикле с помощью range
nums = [n for n in range(1, 11)] print(nums) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Использование числового диапазона range в циклах
Несколько простых примеров:
for i in range(5): print(i) #0 #1 #2 #3 #4
for i in range(5, 10): print(i) #5 #6 #7 #8 #9
for i in range(2, 10, 2): print(i) #2 #4 #6 #8
Функция range для обратного порядка:
for i in range(-2, -10, -2): print(i) #-2 #-4 #-6 #-8
Индексация и срезы в range
Индексация range
Тут все стандартно, как и в списках и в кортежах, индексация начинается 0.
Обращение к элементу диапазона:
data = range(1, 10) print(data[0]) print(data[5]) print(data[-1]) #1 #6 #9
Срезы в range
Синтаксис срезов [I:J:Step]
.
С I
до смещения J
, не включая его.
data = range(1, 10) print(data[1:4]) print(data[:4]) print(data[3:]) #range(2, 5) #range(1, 5) #range(4, 10)
Основные операции с числовым диапазоном range
Длина диапазона: len(r)
data = range(10) print(len(data)) #10
Минимальный элемент диапазона: min(r)
data = range(10) print(min(data)) #0
Максимальный элемент диапазона: max(r)
data = range(10) print(max(data)) #9
Индекс числа в диапазоне: range.index(x[, start[, end]])
Необязательные аргументы start
и end
, указывают на промежуток поиска:
data = range(10) print(data.index(5)) #5
data = range(2, 10) print(data.index(5)) #3
Примеры работы range в задачах
Найти сумму чисел от 1 до 10.
Создадим переменную s
, в которую будем записывать сумму чисел. И присвоим ей значение 0.
Создадим числовой диапазон от 1 до 11 (т.к. range
не включает последнее число в последовательность)
Создадим цикл for
в котором будем перебирать в диапазоне цифры от 1 до 10.
Внутри цикла будем записывать в переменную s
сумму с каждым числом из диапазона.
s = 0 for i in range(1, 11): s = s + i print(s) #55
Найти сумму четных чисел от 1 до 10.
Делаем, все тоже самое, что и в первой задаче, но в range
делаем начало диапазона 0 и шаг 2, таким образом, получаем все четные числа от 0 до 10.
s = 0 for i in range(0, 11, 2): s = s + i print(s) #30
Вывести все буквы строки отдельно.
Создаем цикл длина диапазона, которого равна длине строки.
С помощью индексации выводим каждый элемент строки в цикле.
s = 'abcdef' for i in range(len(s)): print(s[i]) #a #b #c #d #e #f
Частая ошибка index out of range
Это ошибка возникает довольно часто, если не внимательно относиться к границам диапазона.
Допустим, есть список чисел от 1 до 10, нужно оставить в этом списке только числа, которые делятся на 2.
nums = [n for n in range(1, 11)] #генерируем список с числами о 1 до 10 for i in range(len(nums)): #перебераем все числа if nums[i] % 2 != 0: #находим числа, которые не делятся на 2 del nums[i] #удаляем такие числа print(nums) #builtins.IndexError: list assignment index out of range
В итоге вместо результата, получаем ошибку.
Это случилось из-за того, что мы прямо в цикле удалили элемент из списка, тем самым изменив его длину, а это повлияло на диапазон.
Т.е. на старте цикла была одна длина списка с числами, а во время выполнения эта длина изменилась. Python, держа в памяти старую длину, пробует обратиться по индексам к тем элементам, которых уже нет в списке.
Выход довольно прост, чтобы избежать такой ошибки, нельзя изменять список внутри цикла. Вместо этого лучше создавать новый список с нужным результатом.
nums = [n for n in range(1, 11)] #генерируем список с числами о 1 до 10 fin_nums = [] #создаем пустой список for i in range(len(nums)): #перебираем все числа if nums[i] % 2 == 0: #находим числа, которые делятся на 2 fin_nums.append(nums[i]) #добавляем в наш новый список print(fin_nums) #[2, 4, 6, 8, 10]
Теперь все гуд.
Example
If I wanted to find out the sum of numbers from 1
to n
where n
is a natural number, I can do 1 + 2 + 3 + 4 + ... + (several hours later) + n
. Alternatively, I could write a for
loop:
n = 0
for i in range (1, n+1):
n += i
Or I could use a technique known as recursion:
def recursion(n):
if n == 1:
return 1
return n + recursion(n - 1)
Recursion has advantages over the above two methods. Recursion takes less time than writing out 1 + 2 + 3
for a sum from 1 to 3. For recursion(4)
, recursion can be used to work backwards:
Function calls: (
4 ->
4 + 3 ->
4 + 3 + 2 ->
4 + 3 + 2 + 1 ->
10
)
Whereas the for
loop is working strictly forwards:
(
1 ->
1 + 2 ->
1 + 2 + 3 ->
1 + 2 + 3 + 4 ->
10
). Sometimes the recursive solution is simpler than the iterative solution. This is evident when implementing a reversal of a linked list.
Перейти к содержимому
Меню
Сумма диапазона чисел
Напишите функцию, которая будет принимать начальное и конечное число в диапазоне чисел и возвращать сумму всех чисел этого диапазона.
Примеры
sum_problem(-10, 1) ➞ -54 sum_problem(-20, 5) ➞ -195 sum_problem(90, 45) ➞ 3105
Варианты решения
def sum_problem(a, b): return sum(range(min(a, b), max(a, b) + 1)) 7
def sum_problem(a, b): return (a + b) * (abs(a - b) + 1) // 2