Onko Python 2.7 ja Python 3 täysin eri kieli ?
Python 3 siis tarkoittaa joko 3.1.2 tai 3.2.3.
Alimpana copypastettu python -koodi, joka laskee 2000 piin hexadesimaalia.
Netistä löytyi tällainen:
http://ideone.com/
Tässä täysin toimiva: http://ideone.com/cxReD7
Ja tämä: http://ideone.com/P80NBI
taas EI toimi, vaan antaa virheilmoituksen " AttributeError: 'generator' object has no attribute 'next' "
Erona se, että toimiva käyttää Python 2.7, ja hyvin toimii.
Ja ei-toimiva käyttää Python 3.1.2, ja sille siis sama koodi EI kelpaa.
Omalla koneellani on Python 3.2.3, ja se antaa myös saman virheilmoituksen:
" AttributeError: 'generator' object has no attribute 'next' ".
Pitäisikö siis poistaa tuo 3.2.3 -asennus ja asentaa 2.7 tilalle ?
Onko tämä yleensäkin skriptikielille tyypillistä, että kun tulee uusi versio tulkista, niin vanha koodi ei sille enää kelpaakaan? Muistanpa nähneeni toimimattomia web -kauppoja, ja syynä se, että joko PHP tai joku muu vastaava tulkattava kieli, jolla web -kauppa oli tehty, niin kun ei pyöri kauppiaan omalla palvelimella, vaan webhotellista vuokratulla, niin kun webhotellin yläpito päivitti uuteen PHP -versioon, niin webkauppa lakkasi toimimasta.
Sitä sopii miettiä: miksi web -kauppiaat usein ajavat skriptikielellä tehtyä web -kauppasovellusta webhotellilta vuokratussa tilassa siten, että kuitenkin webhotellin ylläpito päättää skriptitulkin (esim. PHP tai Python) päivityksestä, eli kauppias EI päätä. Eikö tuo ole varma tapa ongelmiin, ennemmin tai myöhemmin ?
Tässä vielä Python -koodia piin laskemiseksi, joka siis toimii Python 2.7:lla, mutta ei 3- sarjan Pythonilla:
----------------------------------------
def pi():
N = 0
n, d = 0, 1
while True:
xn = (120*N**2 151*N 47)
xd = (512*N**4 1024*N**3 712*N**2 194*N 15)
n = ((16 * n * xd) (xn * d)) % (d * xd)
d *= xd
yield 16 * n // d
N = 1
pi_gen = pi()
import sys
sys.stdout.write("pi = 3.")
for i in range(2000):
sys.stdout.write("0123456789ABCDEF"[pi_gen.next()])
if (((i 1) % 64) == 0):
sys.stdout.write(" \n")
sys.stdout.write("\n")
Python != Python .... Versiot ???
3
277
Vastaukset
- diibamies
"Onko Python 2.7 ja Python 3 täysin eri kieli ?"
Kyllä ja ei. 3 versiossa kielestä poistettiin paljon menneisyyden painolastia ja sitä siistittiin.
Ehkäpä ne näkyvimmät erot python2 ja python3 välillä:
* python3:ssa print on funktio, kun taas python2 se oli lause (statement)
* python3:ssa kaikki merkkijonot on natiivina unicodea joka järkeistää merkkijonojen käyttöä. Vanhan merkkijonon tilalle tyli byte tyyppi.
Ehkä näkyvimmät erot 3:n ja 3:n välillä on siinä että python3:ssa print on funktio kun 2:ssa se oli vielä lause ja että python3:ssa kaikki merkkijonot on natiivina unicode. Uutena asiana tuli sitten bytes tyyppi jolla voi käsitellä tietoja tavuittain.
Täältähän niitä eroja sitten löytää
http://docs.python.org/3.0/whatsnew/3.0.html
Laitamasi esimerkki korjaantuu kun korjaat tuon yhden rivin tällaiseksi
sys.stdout.write("0123456789ABCDEF"[next(pi_gen)])
No varmasti ongelmia tulee ennenpitkää jos itse ei voi vaikuttaa käytettävään tulkkiin. Onneksi näin ei pitäisi kyllä kovin usein olla. Esim. pythonin kanssa on hyvin helppo käyttää useita eri rinnakkaisversioita samalla palvelimella joilla jokaisella on omat kirjastonsa jne. käyttäen virtualenviä (http://pypi.python.org/pypi/virtualenv). Ongelmaa ei synny kun ei käytä sellaista palvelintarjoajaa joka haluaa määrätä kaiken :)
Ja pythonihan tarjoaa 2to3 apuvälineen porttaamaan 2.x koodin automaattisesti kolmoeen. Ihan kaikesta se ei selviä mutta kun tekee koodin suositusten mukaisesti niin sama koodi toimii käytännössä molemmissa
http://docs.python.org/2/library/2to3.html
(veikkaan että esimerkkisi korjaantuisi tuolla mutta en jaksa testata)
"Pitäisikö siis poistaa tuo 3.2.3 -asennus ja asentaa 2.7 tilalle ?"
Asenna python 3.3, siinä tuli kaikkea kivaa. Python 2.x ei kannata enää juurikaan käyttää muutoin kuin erityisestä pakosta kuten vanhan koodin ylläpitoa, riippuvaisuus päivittämättömään kirjastoon jne.- diibamies
ttu.. olis pitänyt lukea kertaalleen :) editoin sitten tuossa jo kesken kirjoitusta ja tuli väliin sama asiaa kahteen kertaan erilailla.. no ehkäpä se sit tulee paremmin selväksi!
- Ei hyvä
"Onko tämä yleensäkin skriptikielille tyypillistä, että kun tulee uusi versio tulkista, niin vanha koodi ei sille enää kelpaakaan?"
Ei todellakaan. Tuo on tyypillistä open sourcelle. Siinä muutellaan ohjelmia ihan turhaan ja sotketaan siten käyttäjien ohjelmat, kuten nyt taas valitettavasti jouduit huomaamaan.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Klaukkalan onnettomuus 4.4
Klaukkalassa oli tänään se kolmen nuoren naisen onnettomuus, onko kellään mitään tietoa mitä kävi tai ketä onnettomuudes1024457Yleltä tyrmäävä uutinen
Ylen uutisen mukaan Raamattu on keksitty n. 2600. Putoaako kristinuskolta pohja kokonaan alta pois? https://yle.fi/a/743821178- 1861052
Pakko kertoa mies
Äitini tietää, että olen ihastunut sinuun. 😳 halusin että hän näkisi sinun kuvan ja pyysin googlaamaan sinua. Kommentti1091032Sinä vain tulit elämääni
Ja joku tarkoitus sillä on ollut. Näyttämään mitä olen ja kuinka arvokas voisin olla. Se muutti ja käänsi elämäni suunna83903Millaisia ajatuksia on kaivatusta ja tilanteestanne tänään?
Kerro omista mietteistäsi tai lähetä terveisiä. Ehkä hän lukee ja lähettää sinulle takaisin omia mietteitään.47901- 64891
Riitta-Liisa ja Toni Roponen: Ero! Riitta-Liisa Roponen kertoo asiasta Instagramissa.
Riitta-Liisa ja Toni Roponen eroavat. Riitta-Liisa Roponen kertoo asiasta Instagramissa. – Talvi on ollut elämäni synk10847- 64846
Onko se niin
Että meillä molemmilla on niin isot egot ettei voi alentua myöntämään kuin tykkää toisesta64816