"Инициализация" переменных в python?

хотя инициализация переменных в python не требуется, мой профессор все еще хочет, чтобы мы сделали это для практики. Я написал свою программу, и она работала нормально, но после того, как я попытался инициализировать некоторые переменные, я получил сообщение об ошибке при попытке запустить ее. Вот первая часть моей программы:

def main():

    grade_1, grade_2, grade_3, average = 0.0
    year = 0

    fName, lName, ID, converted_ID = ""
    infile = open("studentinfo.txt", "r")
    data = infile.read()
    fName, lName, ID, year = data.split(",")
    year = int(year)

    # Prompt the user for three test scores

    grades = eval(input("Enter the three test scores separated by a comma: "))

    # Create a username

    uName = (lName[:4] + fName[:2] + str(year)).lower()
    converted_id = ID[:3] + "-" + ID[3:5] + "-" + ID[5:]
    grade_1, grade_2, grade_3 = grades

сообщение об ошибке:

grade_1, grade_2, grade_3, average = 0.0

TypeError: 'float' object is not iterable

7 ответов


проблема в линии -

grade_1, grade_2, grade_3, average = 0.0

и

fName, lName, ID, converted_ID = ""

в python, если левая сторона оператора присваивания имеет несколько элементов, которые должны быть выделены, python попытается выполнить итерацию правой стороны много раз и назначить каждое итерированное значение каждой переменной последовательно.

Вам может понадобиться что-то вроде -

grade_1, grade_2, grade_3, average = [0.0 for _ in range(4)]
fName, lName, ID, converted_ID = ["" for _ in range(4)]

существует несколько способов присвоения равных переменных.

самый простой:

grade_1 = grade_2 = grade_3 = average = 0.0

с распаковкой:

grade_1, grade_2, grade_3, average = 0.0, 0.0, 0.0, 0.0

С пониманием списка и распаковка:

>>> grade_1, grade_2, grade_3, average = [0.0 for _ in range(4)]
>>> print(grade_1, grade_2, grade_3, average)
0.0 0.0 0.0 0.0

Я знаю, что вы уже приняли другой ответ, но я думаю, что более широкая проблема должна быть решена - стиль программирования, подходящий для текущего языка.

да, "инициализация" не требуется в Python, но то, что вы делаете, не является инициализация. Это просто неполное и ошибочное подражание инициализации, как это практикуется на других языках. Важная вещь об инициализации в статических типизированных языках-это указание характера переменных.

в Python, как и в других языках, вам нужно дать значения переменных перед их использованием. Но давать им значения в начале функции не важно, и даже неправильно, если значения, которые вы даете, не имеют ничего общего со значениями, которые они получают позже. Это не "инициализация", это "повторное использование".

Я сделаю некоторые заметки и исправления к вашему коду:

def main():
   # doc to define the function
   # proper Python indentation
   # document significant variables, especially inputs and outputs
   # grade_1, grade_2, grade_3, average - id these
   # year - id this
   # fName, lName, ID, converted_ID 

   infile = open("studentinfo.txt", "r") 
   # you didn't 'intialize' this variable

   data = infile.read()  
   # nor this  

   fName, lName, ID, year = data.split(",")
   # this will produce an error if the file does not have the right number of strings
   # 'year' is now a string, even though you 'initialized' it as 0

   year = int(year)
   # now 'year' is an integer
   # a language that requires initialization would have raised an error
   # over this switch in type of this variable.

   # Prompt the user for three test scores
   grades = eval(input("Enter the three test scores separated by a comma: "))
   # 'eval' ouch!
   # you could have handle the input just like you did the file input

   grade_1, grade_2, grade_3 = grades   
   # this would work only if the user gave you an 'iterable' with 3 values
   # eval() doesn't ensure that it is an iterable
   # and it does not ensure that the values are numbers. 
   # What would happen with this user input: "'one','two','three',4"?

   # Create a username 
   uName = (lName[:4] + fName[:2] + str(year)).lower()

   converted_id = ID[:3] + "-" + ID[3:5] + "-" + ID[5:]
   # earlier you 'initialized' converted_ID
   # initialization in a static typed language would have caught this typo
   # pseudo-initialization in Python does not catch typos
   ....

Python обрабатывает запятую с левой стороны знака равенства (= ) в качестве входного сигнала сплиттер, Очень полезно для функций, возвращающих кортеж.

Эл.г,

x,y = (5,2)

что вы хотите сделать, это:

grade_1 = grade_2 = grade_3 = average = 0.0

хотя это может быть не самый ясный способ написать его.


Если вы хотите использовать назначение destructuring, вам понадобится такое же количество поплавков, как у вас есть переменные:

grade_1, grade_2, grade_3, average = 0.0, 0.0, 0.0, 0.0

вы просите инициализировать четыре переменные, используя один объект float, который, конечно, не является итерационным. Вы можете сделать -

  1. grade_1, grade_2, grade_3, grade_4 = [0.0 for _ in range(4)]
  2. grade_1 = grade_2 = grade_3 = grade_4 = 0.0

Если вы не хотите инициализировать их с разными значениями, конечно.


def grade(inlist):
    grade_1, grade_2, grade_3, average =inlist
    print (grade_1)
    print (grade_2)

mark=[1,2,3,4]
grade(mark)