Wombo AI Art -kuvat: dystopia, aasialainen tiimi

Jos pelaisit jotain dystopia-aiheista peliä, niin millaisen tiimin haluaisit? Olisiko tiimissäsi nuorta voimaa vai vanhempaa kokemusta? Vai niiden sekoitus?

Loin Wombo Dream -tekoälyohjelmalla itselleni tiukan tiimin. WD tykkää aasialaisen näköisistä hahmoista, ja onhan näissä leideissä tosi upeaa energiaa ja lujuutta. Kasvonpiirteistä päättelisin, että osa on heistä on sukua keskenään. 😉 Filtterinä käytin Gloomya.

Nuoruus on yliarvostettua.
Kokemus on se, joka rulaa.

Omaan tiimini ottaisin ennen kaikkea kokemusta, jota terästäisin nuoruudella. Tässä olisi oman aasialaistiimini badass ladies. Näiltä naisilta löytyy varmasti monenlaista kokemusta itämaisista taistelulajeista ja aseen käsittelystä älykkäisiin manöövereihin ja strategisiin suunnitelmiin.

Kova tehokaksikko, joka pistää hommat toimimaan ja tekee sen, mikä tehtävä on – silmää räpäyttämättä:
Badass ladies: tehokaksikko
Kaksi matriarkkaa, joilta ei kokemusta puutu. Älykkäät ja neuvokkaat leidit:
Badass ladies: kaksi matriarkkaa
Tiimin peruspilarit, harkitsevat leidit:
Badass ladies: peruspilarit
Nuorta voimaa, vimmaa ja vauhtia:
Badass ladies: nuoret sotilaat

Wombo AI Art -kuvat: matkalla Eva ja Ainhoa

Olen katsellut viikon ajan australialaista sarjaa nimeltä Wanted, ja sen hienot naishahmot ihastuttivat niin, että tuli itsellekin tarve kirjoittaa hieman särmikkäämmistä leideistä. Niinpä pidin vapun tienoilla Tomin ja Julianan tarinasta parin päivän taukoa ja kehittelin ihan omaksi huvikseni uutta tarinaa, sellaista “on the road”-tyyppistä, joista tykkään. 😀

Tässä alla on pieni näyte tarinasta. Ja tietenkin oli ihan pakko tehdä Wombo Dreamillä ja Gloomy-filtterillä kuva näistä tyypeistä. Tässä olen yhdistänyt nopeasti kuvankäsittelyohjelmalla kaksi tekoälyn tekemää kuvaa yhdeksi. Kummallekin leidille sattui nyt tuollainen sininen farkkutakkimukaelma päälle. Olisi ollut ehkä parempi, jos naisella olisi ollut esim. tumma nahkarotsi, mutta näillä mennään, kun ei ollut tämän tärkeämmästä kuvasta kyse. 😉

[snip]

Ajoin eteenpäin ja seurasin tyttöä sivupeilistä. Hän maleksi kädet puuskassa tietä pitkin perässäni, ei vilkuillut sivuille eikä näyttänyt odottavan ketään. Vaikutti siltä, että hän oli tosiaan yksin.
   Pysäytin matkailuauton ja jäin odottamaan. Pidin peilin kautta silmällä hänen käsiään. Halusin nähdä ne koko ajan. Jos hän työntäisi kätensä olalla roikkuvaan laukkuun, painaisin kaasua.
   Hän tuli oven luo, avasi sen ja katsoi minua kysyvästi käsi ovenkahvalla.
   – Tyhjennä laukku penkille.
   – Mitä vittua? En varmaan tyhjennä.
   – Haluan nähdä, ettei sulla ole puukkoa tai muuta asetta siellä.
   – Vittu, sähän voit häipyä mun kamojen kanssa! Emmä mikään idiootti oo.
   – Sulje ovi!
Tyttö katsoi minuun vihaisena, mutta ruskeissa silmissä oli myös jotain rikkimennyttä niin kuin lasimurskaa, kun hän paiskasi oven kiinni ja jäi tuijottamaan ikkunan takaa. Vihaisuudesta huolimatta hän näytti siltä, että saattaisi purskahtaa itkuun.
   Nousin istuimelta ja kömmin takaosaan. Avasin oven. Tyttö ei hievahtanutkaan, tuijotti vain jurona.
   – Pääset kyytiin, jos näytät, mitä sulla on laukussa ja taskuissa.
Kun tyttö ei liikahtanut vieläkään, sanoin:
   – Tuletko vai etkö? Mulle ihan sama.
Tyttö nousi autoon hidastellen ja sulki oven perässään.

[snip]

Wombo AI Art -kuvat: flamencotanssijat

Tekoäly hanskaa usein kasvot oikeinkin mallikkaasti, mutta jos kuvaan haluaa muutakin kuin kasvot ja pään, niin silloin AI:lle voi tulla yllättäviä ongelmia.

Flamencotanssijoita tehdessäni kävi usein, ettei Wombo Dreamin tekoäly tiennyt, kuinka monta sormea ihmisellä on, vaan räppäsi tanssijan käteen kuusikin sormea. Myös raajojen laskemisessa äly sekoili ja saattoi laittaa hahmolle kolme jalkaa tai antaa yksi miehen jalka naiselle. 😉 Tai takaa vasemmalta saattoi naisen uumalle äkkiä ilmestyä kuin tyhjästä kolmas miehen käsi. Hiukan griipiä kyllä! 😀

Myös kasvojen kanssa oli ongelmia. AI oli selvästi ihastunut isonenäisiin miehiin, ja naisten kasvoissa oli kaikenlaista häiriötä ja outoutta. Näissä kuvissa oli parhaimmat kasvot, joten on helppo arvata, miten erikoisia luomuksia ne roskakoriin joutuneet tapaukset olivat. 😀

Sen sijaan frillojen ja röyhelöiden kanssa AI ei juurikaan sekoillut, vaan naisten hameen helmat hulmusivat järestään hienosti, eikö vain?

Wombo AI Art -kuvat: vesivärimuotokuvia

Vesivärilinjalla jatkoin leikkiäni Wombon tekoälyllä. Sijoitin nämä ihmiset Barcelonan kesään. Tarkoituksena oli saada niihin kesäistä tunnelmaa, joten pyysin tekoälyä laittamaan henkilöille myös aurinkolasit silmille. Omasta mielestäni kesä välittyy näistä hyvin, ja melkein voi tuntea auringon lämmön kasvoilla.

Käytin näissä kuvissa myös pyyntöä “looks like [näyttelijän nimi]”. Miehen kohdalla voikin nähdä jotain yhdenmukaisuutta tietyn näyttelijän ulkonäköön 😉 . Jostain syystä tekoäly halusi laittaa miesten kuviin aina parran, vaikka yritin kieltää sitä eri tavoin (no beard, without beard, beardless); ei vain mennyt AI:lle perille se komento, joten parrakkaita miehiä on nyt pilvi täynnä. 😀
Naisten kohdalla mitään yhdennäköisyyttä ei ole nähtävissä näyttelijään, jota käytin pohjana… tai no, ehkä vähän nenässä voi jotain nähdä.
Kesäiset muotokuvat tekoälyllä
Tässä alemmassa kuvassa sama nainen on 20-vuotias ja 50-vuotias. Yhdennäköisyyttä on kyllä nähtävissä, eikö?
Sama nainen 20-vuotiaana ja 50-vuotiaana

Wombo AI Art -kuvat: Tom ja Juliana

Mitä ihminen tekee ensimmäiseksi, kun alkaa leikkiä tekoälyllä, tarkemmin sanottuna sellaisella, joka tekee kuvia? No, suunnittelee kansikuvia Tomin ja Julianan tarinaan, joka on vielä täysin levällään kangaspuissa enkä edes tiedä, näkeekö se koskaan päivänvaloa kirjoittajapiirin ulkopuolella. 😀 Mutta hei, kirjoittaminenkin on minulle leikkiä (aika vakavalla tvistillä tosin), joten viikonlopun ratoksi oli ihan hauska katsella, miten Wombo Dream -tekoäly ymmärsi toiveitani. Ihan aina emme olleet samalla viivalla, joten monia tekeleitä lensi syystä tai toisesta romukoppaan.

Vesivärimaalaukset ovat ihania, eikö? Siispä käytin kahdessa ylimmässä kuvassa Watercolor-filtteriä. Promptiin eli komentoriville kirjoitin varmaan tällaisia toiveita (en enää ihan tarkkaan muista): man and woman, back walking, winter, Turku. Saattoi siinä olla muitakin sanoja. 😉

Alimman kuvan tein pari päivää myöhemmin ja luultavasti käytin samoja sanoja. Ehkä lisäsin myös sanan cold, koska henkilöillä on lämpimämmät vaatteet päällään ja Tomilla on musta pipo (ihan niin kuin tekstissäkin). Filtterinä käytin Gloomya.

Kahdessa ylimmässä kuvassa näkyy jotain vaikutteita Turusta: toisessa Läntiseltä Rantakadulta ja toisessa jostain Vanhan Suurtorin tienoilta. Alinta kuvaa sen sijaan on vaikea sijoittaa edes kuvitteelliseen Turkuun. 😉 Mutta ehkä tekoälyllekin pitää antaa oikeus taiteelliseen luovuuteen. 😀
Tom ja Juliana, talvi

Tom ja Juliana, talvi

Tom ja Juliana, talvi

iMovie, YouTube ja bad request

Tässä päivänä muutamana yhdistelin iMoviessa muutaman videoklipin lyhyeksi videoksi ja päätin tuupata sen YouTubeen. Oli kulunut jo joitakin kuukausia, kun edellisen kerran olin lisännyt YouTubeen sisältöä. iMoviessani kuitenkin on valmiiksi asennettu suora yhteys YouTube-tiliin, niin että mitään ongelmia ei olisi pitänyt tulla eteen. 😉

Video näyttikin lähtevän siirtymään verkon yli ihan mallikkaasti, mutta äkkiä kesken kaiken tuli herjaava pikkuikkuna, joka ilmoitti invalid_grant bad request. Kokeilin uudestaan videon lähettämistä, mutta sama herja pamahti näytölle. Pohdiskelin hetken sitä mahdollisuutta, että olisin muuttanut YouTuben salasanaani tässä välillä. Mutta ratkaisu ongelmaan löytyi toisaalta.

YouTubelle täytyy kertoa uudestaan, että tällä iMovie-ohjelmalla on oikeus lähettää videoita juuri tämän tilin sisältöihin. Vaikka siis se lupa on jo kerran annettu.

Kun videota lähtee tuuppaamaan iMoviesta YouTubeen, avautuu alla olevan kuvan kaltainen pop up -luukku. Jos on sattunut saamaan bad request -herjan, tässä vaiheessa ei klikata vielä sinistä Seuraava-nappia, vaan vasemmassa alakulmassa olevaa omaa sähköpostiosoitetta. Sitä kautta pääsee antamaan iMovielle oikeudet YouTubeen. Itselläni tämä onnistui hyvinkin helposti klikkailemalla YouTuben haluamia “asioita”. 😀
Parin sivun klikkailujen jälkeen videon lähettäminen YouTubeen onnistui jälleen yhtä vaivattomasti kuin ennenkin.

Toivottavasti tästä artikkelista on apua muillekin, jotka painiskelevat saman ongelman kanssa. 🙂

 

Python-jatkokurssi: Pygame-pelitehtävä

Niin vilahti syksy nopeaakin nopeammin algoritmejä kirjoitellessa. 😀 Lokakuun loppupuolella alkoi Helsingin yliopiston Python-jatkokurssi, ja sen aikana ei paljon ehtinyt muuta tehdä. Unetkin olivat pelkkää Pythonia: milloin tein binäärihakua ja milloin for-silmukoita tai listakoosteita. Nyt on kurssi päättynyt, kaikki tehtävät tehty ja palautettu, niin että tentin tulosta tässä enää odotellaan. 😉

Kahdella viimeisellä viikolla tutustuimme pelimaailmaan Pygame-palikan avulla. Lopputyönä meidän täytyi tehdä tietyt kriteerit täyttävä pikkupeli. Jotkut opiskelijakaverit tekivätkin hienoja pelejä, joita on ollut hauska pelata. Oma pelini ei niin ihmeellinen ole, mutta täyttää kuitenkin ne vaaditut kriteerit. Kuvat meille annettiin valmiiksi: robotti, haamu/mörkö, kolikko ja ovi. Niiden tiimoille peli oli tehtävä omia ideoita käyttäen. Peliäni voi pelata vain Python-editorilla, joten tähän postaukseen laitan pelistäni ottamani näytöntallennuksen. Kaikki pelin jutut eivät tule näkyviin videossa, esim. sitä ei näy, jos törmää haamuun tai häviää pelin muuten. Myöskään sloganit, jotka ilmestyvät komentotulkkiin, kun pelaaja lopettaa pelin ESC-näppäimellä, eivät videolla näy. Laitan ne sloganit tähän loppuun. 🙂

Pelin sloganit: 😀
Terve vaan ja kiitos kaloista!
Vierivä python ei sammaloidu.
Jos antaa pythonille pikkusormen, se vie koko käden.
Parempi python pivossa kuin kymmenen kyytä oksalla.
Ei kukaan ole python syntyessään… paitsi python.
Python has left the building. 😀

Python: listojen käsittelyä 2

Tässä artikkelissa käyn läpi, miten alkioita poistetaan listalta. Listojen käsittelyä 1 -sivulla kertoilin, miten alkioita voidaan lisätä listaan.

Kaikkien alkioiden poistaminen listalta yhdellä kertaa

Kun halutaan tyhjentää lista yhdellä kertaa kaikista alkioista, tähän löytyy eri tapoja, joista käsittelen kaksi. Metodi clear tyhjentää listan kertarykäisyllä.

lista = [1, 2, 3, 4, 5]
lista.clear()
print(lista)
[]

Saman asian ajaa del lista[:]. Tässä koodissa lista[:] tarkoittaa koko listan, sen kaikkien alkioiden valitsemista.

lista = ["pippuri", "oregano", "basilika", "rakuuna", "curry"]
del lista[:]
print(lista)
[]

Yksittäisen alkion poistaminen listalta

Kun tiedämme, minkä alkion haluamme poistaa listalta, voimme käyttää remove-metodia. Alla olevaan mausteet-listaan on erehdyksessä joutunut yksi aines, joka vaikkakin saattaisi hieman “maustaa” ruokaa, voisi aiheuttaa myös kalliin matkan hammaslääkäriin. 😉 Se on siis poistettava listalta.

mausteet = ["basilika", "oregano", "mutteri", "rakuuna", "curry"]
mausteet.remove("mutteri")
print(mausteet)
['basilika', 'oregano', 'rakuuna', 'curry']

HUOM! Remove-metodi poistaa listalta vain ensimmäisen parametrin mukaisen alkion. Jos listalla olisi toinen mutteri, se jäisi sinne. Jos epäilemme, että listalla on muttereita enemmänkin, ja haluamme poistaa ne kaikki, niin silloin voimme käyttää for-silmukkaa ja käydä mausteet-listaa läpi alkio alkiolta ja poistaa mutterit sitä mukaa listalta.

mausteet = ["basilika", "oregano", "mutteri", "rakuuna", "mutteri", "curry", "mutteri", "mutteri"]

for alkio in mausteet:
----if "mutteri" in mausteet:
--------mausteet.remove("mutteri")

print(mausteet)
['basilika', 'oregano', 'rakuuna', 'curry']

Kun haluamme poistaa alkion tietystä paikasta, voimme käyttää pop-metodia. Meidän ei siis tarvitse tietää alkiota, ainoastaan sen paikka listassa, esim. nimet[2], eli haluamme poistaa nimet-listalta alkion paikasta 2, ja kukas sitten joutuu leikistä pois. Katsotaan…

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
nimet.pop(2)
print(nimet)
['Ana', 'Carlos', 'Eva', 'Pedro']

¡Adiós, Jorge! 😀
Kun Jorge on poistettu listalta, sen jälkeen tulevien paikat siirtyvät yhden askeleen eteenpäin. Evan paikka muuttuu siis 3:sta 2:ksi ja Pedron 4:stä 3:ksi.

Jos kuitenkin haluamme säilyttää Jorgen varalla, voimme palauttaa hänet omaan muuttujaan (tässä esimerkiksi varalla-nimiseen).

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
varalla = nimet.pop(2)
print(nimet)
['Ana', 'Carlos', 'Eva', 'Pedro']
print(varalla)
Jorge

Listan alkion korvaaminen toisella alkiolla

Alkion voi poistaa myös siten, että korvaa sen jollain toisella alkiolla.

nimet = ["Ana", "Carlos", "Jorge", "Eva", "Pedro"]
nimet[2] = "Javier"
print(nimet)
['Ana', 'Carlos', 'Javier', 'Eva', 'Pedro']

Eli Javier pääsi kentälle Jorgen tilalle, ja Jorge joutui filttiketjuun. 😀


Tässä toinen Python-listoja käsittelevä artikkeli. Jos löysit virheitä tai muuta kommentoitavaa, heitä minua sähköpostiviestillä. 😀


PS. For-silmukssa olen käyttänyt sisennykseen valkoisia tavuviivoja, jotka eivät kuulu koodiin, vaan siinä kuuluisi olla pelkkä sisennys. Span class -sisennys ei suostu toimimaan  WordPressissä, ainakaan minulla, joten on tyydyttävä tällaiseen kepuliratkaisuun.  😉

Python: listojen käsittelyä 1

Tässä artikkelissa käydään läpi Pythonin listojen peruskäsittelyyn liittyvää tilannetta eli alkioiden lisäämistä listaan. Pythonissa listoihin voi tallentaa erilaista tietoa, kuten kokonais- ja liukulukuja, merkkijonoja ja tupleja sekä sanakirjoja. Listan alkioina voi olla myös muita listoja. Listan alkiot tallennetaan hakasulkujen [ ] sisään.
Esimerkkejä:
kokonaislukuja = [1, 5, 9, 205, 4]
liukulukuja = [1.34, 2.01, 75.3, 23.55]
merkkijonoja = ["mekko", "hame", "housut", "hattu", "vaatteita arkeen"]
tuplelista = [(1 , 4), (1.45, 7.5), (90, 54.3)]
sanakirjalista = [{1: "kuusi"}, {2: "koivu"}, {3: "saarni"}]
listalista = [[1, 2, 5], [3, 4, 6], [21, 3, 5]]
sekalista = ["terve taas", 3, [3, 6]]

Pythonin listaan voi lisätä uusia alkiota, listasta voi poistaa alkiota, ja listan alkioita voi järjestellä eri järjestykseen. Lista on siis varsin joustava väline tiedon käsittelyyn.

Alkion lisääminen listaan viimeiseksi

Alkioita voi lisätä listaan eri tavoin. Jos haluamme lisätä alkion listan loppuun, se käy append-metodilla. Esimerkissä listan viimeiseksi lisätään luku 13.

lista = [2, 5, 9, 11]
lista.append(13)
print(lista)
[2, 5, 9, 11, 13]

Toinen vähemmän käytetty tapa toimii samalla tavoin. HUOM! lista += 17 ei toimi, vaan tässä tarvitaan nuo hakasulut lisättävän alkion ympärille.

lista = [3, 6, 8, 10]
lista += [17]
print(lista)
[3, 6, 8, 10, 17]

Alkion lisääminen tiettyyn paikkaan listalla

Koska listan alkiot sijaitsevat tietyssä paikassa listalla, uusia alkioita voi sijoittaa listalla myös tiettyihin paikkoihin. insert-metodilla voidaan sijoittaa uudet alkiot halutuille paikoille listassa. Paikat listalla alkavat nollasta (0, 1, 2, 3, 4…). lista[0] tarkoittaa listan 1. paikkaa. Listan paikat häntäpäästä luettuna ovat lista[-1], lista[-2] jne.
Esimerkissä lista.insert(2, 7) sijoitetaan listassa paikalle 2 uusi luku 7, jolloin siinä paikassa oleva 8 siirtyy seuraavalle paikalle, samoin kaikki sen jälkeen tulevat alkiot siirtyvät yhden paikan verran eteenpäin.

lista = [5, 6, 8, 9]
print(lista[2])
8
lista.insert(2, 7)
print(lista[2])
7
print(lista)
[5, 6, 7, 8, 9]

Alkion lisääminen tyhjään listaan

Sekä append- että insert-metodia voi käyttää tässäkin, kun halutaan lisätä yksittäisiä alkioita listaan.

lista = []
print(lista)
[]
lista.append("Python")
lista.append("kivaa.")
print(lista)
['Python', 'kivaa.']
lista.insert(1, "on")
print(lista)
['Python', 'on', 'kivaa.']

Joskus voi tulla eteen sellainen erikoistilanne, että tyhjään listaan täytyy lisätä sama alkio monta kertaa. Tässä pääsee kaikkein helpoimmalla näin. Esimerkissä haluamme lisätä tyhjään listaan 10 kpl kakkosia. Lista ja alkiot luodaan yhtä aikaa yhdellä rivillä.

lista = [2] * 10
print(lista)
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

Lopuksi esimerkki siitä, miten voidaan pyytää käyttäjää lisäämään alkioita tyhjään listaan. Tätä toki voi käyttää myös silloin, kun listalla on jo alkioita. Käytetään tässä kätevää for-silmukkaa, jonka avulla käyttäjää pyydetään kolme kertaa syöttämään tyhjälle listalle jonkin alkion.
Koodi voisi näyttää esimerkiksi tältä:

lista = []
for syote in range(3):
----syote = input("Syötä mitä tahansa: ")
----lista.append(syote)
print(lista)

Tulostus voisi näyttää tältä:

Syötä mitä tahansa: 56
Syötä mitä tahansa: nappi
Syötä mitä tahansa: 3.14
['56', 'nappi', '3.14']

HUOM! Listan alkiot ovat tässä esimerkissä kaikki merkkijonoja, myös luvut, sillä inputissa ei määritelty alkioiden tyyppiä.

Alkion lisääminen uuteen listaan

Monesti on järkevää säilyttää alkuperäinen lista koskemattomana ja luoda uusi samanlainen lista, johon sitten lisätään tarvittavat uudet alkiot. Näin meillä on kaksi listaa, emmekä menetä alkuperäisen listan tietoja, jos niitä joskus tarvitaan. Tähän tilanteeseen on tarjolla eri tapoja, joista tässä kaksi.

Ensimmäisessä esimerkissä luodaan uusi tyhjä lista. Tämän jälkeen käydään for-silmukan avulla vanhan listan alkiot läpi – alkio alkiolta – ja lisätään append-metodilla samoin tein uuteen listaan. For-silmukan jälkeen lisätään uuteen listaan vielä yksi alkio viimeiseksi.

lista = [1, 2, 3, 4]
uusi = []

for alkio in lista:
----uusi.append(alkio)
uusi.append("listassa on neljä lukua")

print(uusi)
[1, 2, 3, 4, 'listassa on neljä lukua']
print(lista)
[1, 2, 3, 4]

Toisessa tapauksessa käytetään lyhyempää listan kopiointitapaa uusi = lista[:], jossa luodaan vanhasta listasta täydellinen kopio uuteen.

lista = [2, 4, 6]
uusi = lista[:]

uusi.append("listassa on kolme parillista lukua")

print(uusi)
[2, 4, 6, 'listassa on kolme parillista lukua']
print(lista)
[2, 4, 6]

Molemmissa tapauksissa alkuperäinen lista jää koskemattomaksi.

Kahden listan yhdistäminen: extend

Jos täytyy yhdistää kaksi listaa yhdeksi, tällöin apuun tulee extend-metodi. Alla olevassa esimerkissä lista2 yhdistetään lista1:een.

lista1 = [1, 2, 3, 4, 5]
lista2 = [6, 7, 8, 9, 10]
lista1.extend(lista2)
print(lista1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


Tässä ensimmäinen Python-listoja käsittelevä artikkeli. Jos jäit jotain kaipaamaan tai jos jotain virheellistä olen tässä höpötellyt, niin pistä tulemaan viestiä. 😀
25.8.2020 Päivitin tekstiä extend-metodilla (Kahden listan yhdistäminen).


PS. Koodissa tarvittavissa sisennyksissä käytin ns. “köyhän naisen menetelmää”, eli taustan värisiä (valkoisia) tavuviivoja, joiden avulla sain siirrettyä sisennettävän rivin suurin piirtein oikealle kohdalle. WordPress ei tarjoa tällaiseen tapaukseen helppoa tapaa, jolla yhden rivin saisi heittäen sisennettyä. Joten jos kopioit koodeja suoraan tältä sivulta, kannattaa tavuviivojen kohdalle tehdä oikeoppinen sisennys Python-ohjelmassa, muuten koodi ei toimi. 😀

Python: tulostuksen muotoilu

Python-ohjelmoinnin peruskurssi Helsingin avoimessa yliopistossa on takanapäin, ja ajattelin kirjoitella muutamia tietoiskun kaltaisia artikkeleja Python-ohjelmointikielestä itseäni ja asiasta kiinnostuneita varten. 😀 Tämä on ensimmäinen, ja käsittelee tulostuksen muotoilun perusjuttuja.

Pythonissa on eri tapoja, joilla tulostuksen ulkonäköä voi muotoilla. Riippuen tapauksesta voi valita itselleen mieluisimman tai helpoimman.

Yhden rivin tulostus

Tämä on se kaikkein helpoin tapaus, jossa ei tarvita mitään sen kummempaa, ja monissa tapauksissa tämä riittää, eli ei tarvita kuin print-komento.

print("Huomenta!")
Huomenta!

print("Huomenta! Mitä kuuluu? Kuinka voit tänään?")
Huomenta! Mitä kuuluu? Kuinka voit tänään?

Kahden tai useamman rivin tulostus

Tähän on kaksikin mahdollisuutta. Ensimmäinen: print-komennot voi laittaa alekkain, jolloin jokainen rivi tulostuu omalle rivilleen. Tyhjän rivin voi tulostaa komennolla print().

print("Huomenta!")
print("Mitä kuuluu?")
print()
print("Ihan hyvää.")
Huomenta!
Mitä kuuluu?

Ihan hyvää.

Toisessa vaihtoehdossa voidaan käyttää yhtä print-komentoa ja ilmaista rivinvaihdot \n-merkillä ilman välilyöntejä. Ja jos haluaa tyhjän rivin väliin, niin \n\n tuo tähän ratkaisun.

print("Huomenta!\nMitä kuuluu?\nKuinka voit tänään?")
Huomenta!
Mitä kuuluu?

Kuinka voit tänään?

Tulostus muuttujien kanssa

Pelkän muuttujan tulostaminen käy myös helposti.

nimi = "Seija"
print(nimi)
Seija

Kun tulostuksessa on muuttujia ja merkkijonoja, tarvitaan muita ratkaisuja.

Tulostus pilkkujen kanssa

Muuttujat ja merkkijonot voidaan tulostaa samalla print-komennolla, kun ne yhdistetään pilkulla.

nimi = "Helmi"
print(nimi, "jäi eilen eläkkeelle.")
Helmi jäi eilen eläkkeelle.

nimi = "Hannu"
ika = 60
print(nimi, "täyttää maanantaina", ika, "vuotta.")
Hannu täyttää maanantaina 60 vuotta.

Pilkku luo automaattisesti välilyönnin muuttujan ja merkkijonon väliin, joten koodaajan ei tarvitse välilyöntiä napauttaa, ellei halua tehdä koodista luettavampaa, kuten yllä. Sellaisissa tilanteissa, joissa muuttuja halutaan suomen kielioppisääntöjen mukaan liittää ilman välilyöntiä merkkijonoon, pilkku-muotoilu ei käy, kuten tilanteessa 60-vuotias, jossa 60 olisi muuttujan arvo.

Tulostus käyttäen merkkiä +

Kun tulostuksessa yhdistetään muuttujia ja merkkijonoja +-merkillä, täytyy koodaajan muistaa lisätä välilyönnit lainausmerkkien sisään, joko alkuun tai loppuun tai molempiin, riippuen tilanteesta. +-merkki ei luo välejä, kuten pilkku tekee. Alla olevasta esimerkistä näkee, milloin koodaajan täytyy laittaa välilyönti ja milloin se on syytä jättää pois. Esimerkiksi ”n isoäiti”-kohdassa ennen n-kirjainta ei laiteta välilyöntiä, koska sillä ilmaistaan nimi1:n eli Seija-merkkijonon genetiivimuotoa.

nimi1 = "Seija"
nimi2 = "Helmi"
print(nimi1 + " pääsi yliopistoon opiskelemaan. " + nimi2 + " on " + nimi1 + "n isoäiti.")
Seija pääsi yliopistoon opiskelemaan. Helmi on Seijan isoäiti.

+-merkin käytössä on se ongelma tai muistettava asia, että jos muuttujan arvo on jokin muu kuin merkkijono, kuten esimerkiksi kokonaisluku tai liukuluku, tämä täytyy muuttaa merkkijonoksi: str(muuttuja).

nimi = "Veikko"
ika = 73
print(nimi + " on " + str(ika) + "-vuotias.")
Veikko on 73-vuotias.

Tulostus f-merkkijonolla

Äkkiseltään f-muotoilu saattaa näyttää kaikista hankalimmalta tulostuksen muotoilulta, mutta loppupeleissä se ehkä onkin muuttujien, numeroiden ja merkkijonojen yhteistulostuksissa kaikkein vaivattomin, kunhan on ensin opetellut aaltosulkujen käytön. f-muotoilussa muuttuja laitetaan aaltosulkujen sisään {muuttuja} ja koko tulostettava rötlä lainausmerkkien väliin ja ensimmäisen lainausmerkin eteen kirjan f. Muuten voi kirjoittaa ihan normaalisti napauttaen normaalit välilyönnit tarvittaessa.

nimi1 = "Seija"
nimi2 = "Helmi"
print(f"{nimi1} pääsi yliopistoon opiskelemaan. {nimi2} on {nimi1}n isoäiti.")
Seija pääsi yliopistoon opiskelemaan. Helmi on Seijan isoäiti.

Tässäkin tulostuksen muodossa on pieni mutta, kuinkas muuten. 😉 Joissakin tilanteissa voi olla, että muuttujassa on lainausmerkit; tällöin tulee sisäkkäisten lainausmerkkien ongelma eikä tulostus toimi. Tähän on helppo ratkaisu: laittaa ne sisemmät lainausmerkit yksinkertaisina ’ ’, niin ongelma poistuu.

f-muotoilussa voidaan tulostusta muotoilla myös monipuolisemmin; sillä voi tehdä vaikkapa taulukoiden näköisiä ratkaisuja, mutta se on sitten jo toisen artikkelin aihe.

Pieni erikoistapaus liukuluvun muotoilusta tähän loppuun. Jos haluamme tulostaa liukuluvun hieman lyhyemmällä rimpsulla, voimme käyttää f-muotoilua.

pii = 3.14159265358979323846
luku = 55.1234567891
print(f"Pii on {pii:.4f} ja luku on {luku:.2f}.")
Pii on 3.1416 ja luku on 55.12.

Yllä olevassa esimerkissä, kohdissa .2f ja .4f, kirjain f tarkoittaa liukulukua (float). Ja kuten näkyy, piin tulostuksessa tapahtui myös pyöristys ylöspäin.

Tässä ensimmäinen Python-pläjäys. Jos jäit jotain kaipaamaan tai jotain virheellistä olen höpötellyt, niin pistä viestiä.