Kuten tiedämme, Pythonin kaltainen ohjelmointikieli on tulkittu kieli, mikä tarkoittaa käytännössä sitä, että jokainen koodilohko tai koodirivi käsitellään yksi kerrallaan sen sijaan, että muuttaisi koko ohjelmaa matalan tason koodiksi.
Aina kun Pythonin tulkki skannaa koodirivin ja huomaa jotain poikkeuksellista, se aiheuttaa virheen, joka tunnetaan nimellä syntaksivirhe. Yleensä puuttuva hakasulku, puuttuva lopullinen lainaus ja muut syntaksin perustavanlaatuiset poikkeamat ovat syynä virheiden esiintymiseen.
Seuraavassa opetusohjelmassa aiomme löytää yhden Pythonin syntaksivirheistä, jotka tunnetaan nimellä EOL, ja joka yleensä ilmaantuu, kun yritämme skannata merkkijonoliteraalia.
EOL:n merkityksen ymmärtäminen
Meidän on ymmärrettävä EOL:n merkitys tehokkaasti ennen ongelman ratkaisemista. EOL on lyhenne sanoista 'End of Line'. EOL-virhe tarkoittaa, että Pythonin tulkki saavutti rivin lopun skannattaessa merkkijonoliteraalia.
Merkkijonoliteraalit, jotka tunnetaan myös vakioina, on suljettava kerta- tai kaksoislainausmerkkeihin. 'Rivin lopun' saavuttaminen, kun yritämme skannata, tarkoittaa, että olemme saavuttaneet merkkijonon viimeisen merkin emmekä ole kohdanneet lopullisia lainausmerkkejä.
Tarkastellaan perusesimerkkiä, joka osoittaa, kuinka EOL-virhe nostetaan esiin.
Esimerkki:
# defining a string value my_string = 'This is my string literal, and it is broken... # printing the string value print('String:', my_string)
Lähtö:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal, and it is broken... ^ SyntaxError: EOL while scanning string literal
Selitys:
Yllä olevassa koodinpätkässä olemme määrittäneet merkkijonoliteraalin; Olemme kuitenkin unohtaneet lainausmerkin merkkijonon lopusta, joka nosti syntaksivirhe kutsutaan EOL:ksi tulostaessaan merkkijonoa käyttäjille.
Tulostusosassa voimme havaita pienen nuolen, joka osoittaa merkkijonon viimeiseen merkkiin, mikä osoittaa, että virhe tapahtui, kun ohjelma yritti jäsentää lauseen kyseisen segmentin.
Nyt kun olemme ymmärtäneet ongelman, ymmärrämme joitain tapauksia, joissa tämä virhe voi ilmetä python-koodia suoritettaessa.
Korjataan 'Syntaksi Error: EOL skannattaessa merkkijono literaalia'.
Voimme kohdata tämän virheen neljässä päätilanteessa työskennellessämme Python-ohjelman parissa. Nämä neljä päätilannetta ovat seuraavat:
- Loppulainausmerkki puuttuu
- Väärän loppulainausmerkin käyttäminen
- Merkkijonojen jatkuva venytys useille riveille
- Kenoviivan käyttö ennen lainausmerkkiä
Alkakaamme ymmärtää jokainen näistä tilanteista ja yrittää kiertää ne.
Loppulainausmerkki puuttuu
Kuten edellisessä koodinpätkässä todettiin, Python-tulkki aiheuttaa syntaksivirheen aina, kun se saavuttaa merkkijonoliteraalin lopun ja huomaa, että lainausmerkki puuttuu.
Esimerkki:
# defining a string value my_string = 'This is my string literal, and it is broken... # printing the string value print('String:', my_string)
Selitys:
Voimme havaita, että lainausmerkki kirjallisen merkkijonon lopusta puuttuu, mikä myös oikeuttaa syntaksivirheen. Jokaisella kielellä on muutamia syntaksia koskevia perussääntöjä, joita rikottaessa syntyy virheitä.
Tarkastellaan nyt seuraavaa syntaksia ratkaisuna yllä olevaan ongelmaan.
Ratkaisu:
# defining a string value my_string = 'This is my string literal, and it is broken...' # printing the string value print('String:', my_string)
Lähtö:
String: This is my string literal, and it is broken...
Selitys:
Yllä olevassa koodinpätkässä voimme havaita, että olemme sisällyttäneet lainausmerkin kirjaimellisen merkkijonon loppuun. Tämän seurauksena merkkijono tulostetaan käyttäjille onnistuneesti ilman syntaksivirheitä.
Väärän loppulainausmerkin käyttäminen
Voimme hyödyntää '' yhtä hyvin kuin '' sulkeakseen Pythonissa tietyn merkkijonovakion. Ohjelmoija käyttää kuitenkin usein väärää lainausmerkkiä merkkijonon arvon lopussa. Tällainen tilanne saa ohjelman esiin syntaksivirheen EOL:n kannalta.
Tarkastellaanpa tällaista tilannetta seuraavassa esimerkissä:
Esimerkki:
# defining a string value my_string = 'This is my string literal with wrong quotation mark at the end.' # printing the string value print('String:', my_string)
Lähtö:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal with wrong quotation mark at the end.' ^ SyntaxError: EOL while scanning string literal
Selitys:
Yllä olevassa koodinpätkässä olemme käyttäneet virheellistä lainausmerkkiä merkkijonon arvon lopussa, mikä johtaa syntaksivirheeseen.
Voimme välttää tällaisen ongelman käyttämällä vastaavaa lainausmerkkiä merkkijonon lopussa, kuten seuraavassa koodinpätkässä näkyy.
Ratkaisu:
# defining a string value my_string = 'This is my string literal with wrong quotation mark at the end.' # printing the string value print('String:', my_string)
Lähtö:
String: This is my string literal with wrong quotation mark at the end.
Selitys:
Kuten voimme havaita, yllä olevassa koodinpätkässä olemme käyttäneet vastaavaa lainausmerkkiä merkkijonon lopussa, mikä auttaa meitä välttämään EOL-virheitä.
Merkkijonojen jatkuva venytys useille riveille
Monet aloittelevat Python-ohjelmoijat tekevät virheen venyttäessään lauseita useammalle kuin yhdelle riville. Python ottaa uuden rivin huomioon lauseen lopussa, toisin kuin muut kielet, kuten C++ ja Java, jotka harkitsevat ';' lausuntojen lopussa.
Tarkastellaanpa esimerkkiä, joka osoittaa saman ongelman.
Esimerkki ongelmasta:
# defining a string value my_string = 'This is my string literal... this is my new line' # printing the string value print('String:', my_string)
Lähtö:
File 'D:Python ernarypy.py', line 2 my_string = 'This is my string literal... ^ SyntaxError: EOL while scanning string literal
Selitys:
missä on kannettavan tietokoneen näppäimistön insert-näppäin
Yllä olevassa koodinpätkässä voimme havaita, että koodi saattaa näyttää tavalliselta; kuitenkin heti kun seuraava rivi alkaa, Python-tulkki lopettaa tämän lauseen aiheuttaen syntaksivirheen, koska merkkijonovakiota ei ole sisällytetty.
Voimme kuitenkin ratkaista tämän ongelman eri menetelmillä, kuten alla on esitetty:
Ratkaisu 1: Käytä -näppäintä uuden rivin vaikutuksen aikaansaamiseksi merkkijonovakioon
# defining a string value my_string = 'This is my string literal... this is my new line' # printing the string value print('String:', my_string)
Lähtö:
String: This is my string literal... this is my new line
Selitys:
Yllä olevaan koodinpätkään olemme sisällyttäneet ' ' merkkijonovakiossa tuottamaan siihen uuden rivin vaikutuksen. Tämän seurauksena merkkijonovakio hajottaa lausunnon useiksi riveiksi.
Mietitään nyt toista ratkaisua.
Ratkaisu 2: Käytä kolminkertaisia lainausmerkkejä, ''' tai ''' monirivisten merkkijonovakioiden tallentamiseen
# defining a string value my_string = '''This is my string literal... this is my new line''' # printing the string value print('String:', my_string)
Lähtö:
String: This is my string literal... this is my new line
Selitys:
Yllä olevassa koodinpätkässä olemme käyttäneet kolminkertaista lainausmerkkiä, '''' monirivisten merkkijonovakioiden tallentamiseksi.
Kenoviivan käyttö ennen lainausmerkkiä
Kenoviiva '' on vastuussa merkkijonon pakenemisesta ja aiheuttaa syntaksivirheen.
Tarkastellaanpa seuraavaa esimerkkiä.
Esimerkki:
# storing a directory path my_string = 'D:PythonMy_Folder' # printing the string value print('String:', my_string)
Lähtö:
File 'D:Python ernarypy.py', line 2 my_string = 'D:PythonMy_Folder' ^ SyntaxError: EOL while scanning string literal
Selitys:
Yllä olevassa koodinpätkässä olemme käyttäneet kenoviivaa '' kansion polkujen erottamiseksi toisistaan. Python-tulkki nosti kuitenkin syntaksivirheen ohjelman suorituksen aikana.
Viimeinen kenoviiva ennen lainausmerkkiä ohittaa merkkijonovakion, ja Python-tulkki ottaa huomioon ' yhtenä hahmona. Tämä erotussekvenssi tarkoittaa lainausmerkkiä (') .
Voimme ratkaista tämän ongelman käyttämällä seuraavaa koodinpätkää.
Ratkaisu:
# storing a directory path my_string = 'D:\Python\My_Folder\' # printing the string value print('String:', my_string)
Lähtö:
String: D:PythonMy_Folder
Selitys:
Yllä olevassa koodinpätkässä olemme käyttäneet '\' merkkijonovakiossa. Tämän seurauksena Python-tulkki suorittaa kyseisen merkkijonon aiheuttamatta virhettä.