При передаче в "шаг" цикла результата функции, выдаёт ошибку 'NoneType'

Решил написать программу, которая сможет просуммировать несколько раз одно и то же число в заданном диапазоне. При этом, что бы шаг цикла составлял дробное число.

class calculator:     
                                                                                                                         
    def __init__ (self):                                                                                                                          
        self.y = 0                                                                                                                                
        self.step_c = 1                                                                                                                           
                                                                                                                                                  
    def flt_to_int (self, step_x):                                                                                                                
        while step_x <= 1:                                                                                                                        
            step_x *= 10                                                                                                                          
            self.step_c *= 10                                                                                                                     
        step_x = int (step_x)                                                                                                                     
                                                                                                                                                  
    def add (self, init_x, fin_x, step_x, const):                                                                                                 
        Fout = open ("Initial_File.txt","w")                                                                                                      
        for x in range (init_x, fin_x, step_x):                                                                                                   
            self.y += const                                                                                                                       
            x /= self.step_c                                                                                                                      
            if x == 0:                                                                                                                            
                self.y = 0                                                                                                                        
            Fout.write (f"{x} {self.y}\r\n")                                                                                                      
        Fout.close ()                                                                                                                                                                                                                                                                               

start = int (input ())                                                                                                                            
finish = int (input ())                                                                                                                           
step = float (input ())                                                                                                                           
const = int (input ())                                                                                                                                                                                                                                                                           
calculator().add (start, finish, calculator().flt_to_int(step), const)  

Выдаёт ошибку:

TypeError: 'NoneType' object cannot be interpreted as an integer.

Почему возникает эта ошибка и как ее исправить?


Ответы (1 шт):

Автор решения: mrEvgenX

Не хватает return step_x в функции flt_to_int

По возможности, наглядное объяснение

calculator().add (start, finish, calculator().flt_to_int(step), const)

Что вы делаете в этой строчке?

  • calculator() создаете объект класса calculator
  • .add(...) вызываете у объекта функцию с четырьмя аргументами

Какие это аргументы?

  • start - число, которое ввел пользователь, приведенное к int
  • finish - еще одно введеное число
  • calculator().flt_to_int(step) - а это что такое? Мы к этому вернемся
  • const - еще одно введенное число
calculator().flt_to_int(step)

Здесь вы:

  • снова создаете объект класса calculator, никак не связанный с объектом, созданным ранее
  • вызываете у объекта функцию flt_to_int с аргументом step

Что делает функция flt_to_int?

  • принимает аргумент типа float
  • всячески изменяет его в цикле, финально приводит к int
  • завершает свою работу
  • И все

Что-нибудь смущает?

В Python, если в функции нет явного return, то это значит return None. А в add в качестве третьего аргумента попадает возвращаемое значение flt_to_int, а это None. И доходя до range(init_x, fin_x, step_x) получается range(init_x, fin_x, None), а это ошибка.

Вывод: не хватает return step_x в функции flt_to_int.

PS

Пишите полностью все, что выдает интерпретатор, те самые много строк с именами файлов и номерами строк. Это очень важно.

→ Ссылка