"Инициализация" переменных в 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, который, конечно, не является итерационным. Вы можете сделать -
grade_1, grade_2, grade_3, grade_4 = [0.0 for _ in range(4)]
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)