Как найти сумму чисел в промежутке python

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) 1

result = 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

user3672933's user avatar

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

ex0ns's user avatar

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

Christer Nissen's user avatar

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

mhawke's user avatar

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

Sesha's user avatar

SeshaSesha

2021 silver badge5 bronze badges

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • 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

    Понравилась статья? Поделить с друзьями:
  • Как найти радиус кривизны траектории полета
  • Как найти общий язык маме с сыном
  • Как найти письмо минфина
  • Медиана интервального вариационного ряда как найти
  • Как составить договор на рассрочку авто