“Initialiseren” variabelen in Python?

Hoewel het initialiseren van variabelen in Python niet nodig is, wil mijn professor nog steeds dat we het voor de praktijk doen. Ik schreef mijn programma en het werkte prima, maar nadat ik probeerde een deel van de variabelen te initialiseren, kreeg ik een foutmelding toen ik het probeerde uit te voeren. Hier is het eerste deel van mijn programma:

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

Het foutbericht:

grade_1, grade_2, grade_3, average = 0.0
TypeError: 'float' object is not iterable

Antwoord 1, Autoriteit 100%

Het probleem is in de regel –

grade_1, grade_2, grade_3, average = 0.0

en

fName, lName, ID, converted_ID = ""

In Python, als de linkerkant van de opdrachtoperator meerdere variabelen heeft, probeert Python de rechterzijde die vele malen te herhalen en elke herhaalde waarde aan elke variabele opeenvolgend toewijst. De variabelen grade_1, grade_2, grade_3, averageNeed Three 0.0waarden om aan elke variabele toe te wijzen.

Misschien heb je misschien iets nodig –

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

Antwoord 2, autoriteit 96%

Er zijn verschillende manieren om de gelijke variabelen toe te wijzen.

De gemakkelijkste:

grade_1 = grade_2 = grade_3 = average = 0.0

Met uitpakken:

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

Met lijstbegrip en uitpakken:

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

Antwoord 3, autoriteit 93%

Ik weet dat je al een ander antwoord hebt geaccepteerd, maar ik denk dat het bredere probleem moet worden aangepakt: programmeerstijl die geschikt is voor de huidige taal.

Ja, ‘initialisatie’ is niet nodig in Python, maar wat u doet is dat niet
initialisatie. Het is gewoon een onvolledige en foutieve imitatie van initialisatie zoals die in andere talen wordt toegepast. Het belangrijkste van initialisatie in statisch getypeerde talen is dat u de aard van de variabelen specificeert.

In Python, net als in andere talen, moet je variabelenwaarden geven voordat je ze gebruikt. Maar het geven van waarden aan het begin van de functie is niet belangrijk, en zelfs verkeerd als de waarden die u geeft niets te maken hebben met waarden die ze later ontvangen. Dat is geen ‘initialisatie’, dat is ‘hergebruik’.

Ik zal wat aantekeningen en correcties in je code maken:

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 handled 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
   ....

Antwoord 4, autoriteit 36%

Python behandelt de komma aan de linkerkant van het gelijkteken ( =) als invoersplitser,
Erg handig voor functies die een tuple retourneren.

bijv.

x,y = (5,2)

Wat u wilt doen is:

grade_1 = grade_2 = grade_3 = average = 0.0

hoewel dat misschien niet de meest duidelijke manier is om het te schrijven.


Antwoord 5, autoriteit 21%

Je vraagt om vier variabelen te initialiseren met een enkel float-object, wat natuurlijk niet itereerbaar is. Je kunt doen –

  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

Tenzij je ze natuurlijk met andere waarden wilt initialiseren.


Antwoord 6, autoriteit 14%

Als je de destructieve opdracht wilt gebruiken, heb je hetzelfde aantal floats nodig als variabelen:

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

Antwoord 7

def grade(inlist):
    grade_1, grade_2, grade_3, average =inlist
    print (grade_1)
    print (grade_2)
mark=[1,2,3,4]
grade(mark)

Other episodes